- 리눅스 프로세스 스케쥴링
- 리눅스에서는 특정한 시간에 어떤 작업을 수행하기 위해 스케줄링이라는 기능을 사용한다.
- 스케줄링에는 at 과 cron 두 가지가 있으며 모두 데몬이 실행중이어야 한다.
- at 스케줄링은 주로 프로그램을 특정시간에 한 번만 사용하고 싶을 때 이용한다.
- cron 스케줄링은 프로그램을 특정 날짜나 시간, 요일에 맞춰 주기적으로 사용하고 싶을 때 이용한다.
([Linux] at이란? https://dev-record-levelup.tistory.com/2)
- Cron이란?
- 특정한 시간에 또는 특정 시간 마다 어떤 작업을 자동으로 수행하게 해주고 싶을 때 사용하는 명령어.
- cron은 특정한 시간에 특정한 작업을 수행하게 해주는 스케줄링 역할을 한다.
- cron이 언제 무엇을 하는지 특정 파일에 저장하는 것을 크론탭(Crontab)이라고 한다.
예를 들어, 새벽 4시에 데이타베이스 백업 받아 줘라든지, 아침 7시에 서버의 사용량을 리포트하도록 한다든지 등등 적절하게 사용하면 아주 편리하게 성과를 낼 수 있는 방법이다.
- Crontab은 언제 사용하는지?
- 특정 시간에 특정 작업을 해야 할 때
- 반복된 시간에 반복된 작업을 해야 할 때
- 예약 작업을 사용해야 할 때
- Crontab 설정
- etc 하위에 위치한 crontab파일을 열어 crontab 설정 방법을 확인한다.
필드 | 설명 | 입력 가능 예시 |
m | minute, 분 정보를 입력한다. | 0~59 사이의 숫자 |
h | hour, 몇시에 수행될지를 정하는 시 정보 | 0~23 사이의 숫자 |
dom | day of month (= day), 일자 정보 | 1~31 (1~해당 월의 최대일자까지) |
mom | month, 월 정보 | 1~12 |
dow | day of week, 요일정보 | 0~7 (0 일요일, 1 월요일, 2 화요일 순으로 증가. 7은 다시 일요일) |
user | user, 사용자 정보 | |
command | command, 수행되어야 할 명령어 |
- Crontab 명령어
일부러 잘못된 옵션을 주고 명렁어를 수행하면 아래와 같이 도움말을 볼 수 있다.
# 현재 크론탭에 설정되어 있는 내용 확인
crontab -l
# 크론탭 내용 입력/수정 (vi 에디터 활용, 설정 입력 후 :wq 로 저장)
crontab -e
# 현재 크론탭에 설정되어 있는 내용 삭제
crontab -r
# 특정 user의 crontab을 설정할 때
# 다른 명령어를 쓸 때 같이 쓰면 특정 사용자의 crontab 조회 및 수정 가능
crontab -u
# crontab 내용 삭제 전 확인 문구 띄우기
# confirm창 같은 느낌으로, 삭제여부 재확인
crontab -i
- 삭제 전 확인 문구 띄우기, crontab -i -r 또는 crontab -ir 모두 동일하게 동작함.
- 아래 명령어를 통해 실행 중인 cron 프로세서를 확인할 수 있다.
ps -ef|grep crond
- 예제
- crontab -e 명령어를 사용하면 vi 모드로 전환이 되면서 crontab을 등록할 수 있다.
매분 실행
# 매분 test.sh 실행
* * * * * /home/script/test.sh
* (asterisk) : 해당 기호가 입력되면 해당 필드의 모든 값에서 cron이 수행된다.
특정 시간 실행
# 매주 금요일 오전 5시 45분에 test.sh 를 실행
45 5 * * 5 /home/script/test.sh
반복 실행
# 매일 매시간 0분, 20분, 40분에 test.sh 를 실행
0,20,40 * * * * /home/script/test.sh
, (comma) : 특정 값을 여러 개 지정할 수 있다. 구간이나 주기로 지정이 안되는 불특정한 값일 때 사용
범위 실행
# 매일 1시 0분부터 30분까지 매분 tesh.sh 를 실행
0-30 1 * * * /home/script/test.sh
- (dash) : 숫자 구간을 지정할 수 있다.
간격 실행
# 매 10분마다 test.sh 를 실행
*/10 * * * * /home/script/test.sh
/ (slash) : 값을 특정 주기로 나눌 때 사용
조금 복잡하게 실행
# 5일에서 6일까지 2시,3시,4시에 매 10분마다 test.sh 를 실행
*/10 2,3,4 5-6 * * /home/script/test.sh
→ crontab을 설정하고 wq로 저장한다.
- Crontab 설정 변경내용 적용
- crontab -e로 새롭게 저장한 뒤에는 crontab 변경 내용에 대해서 명령어로 재시작 또는 시작해줘야 한다.
- 시작, 재시작, 중단 명령어는 ubuntu와 linux가 다르다.
OS | ubuntu | linux |
시작 | service cron start | service crond start |
재시작 | service cron restart | service crond restart |
중단 | service cron stop | service crond stop |
상태 확인 | service cron status | service crond status |
- Crontab 권한
- Crontab 권한 부여
cron.allow
- cron 허용 계정목록
- (기본값) 파일 없음 → 모두 허용
[root@zetawiki ~]# ll /etc/cron.allow
ls: cannot access /etc/cron.allow: No such file or directory
cron.deny
- cron 금지 계정목록
- (기본값) 내용 비어 있음 → 모두 허용
[root@zetawiki ~]# ll /etc/cron.deny
-rw-r--r--. 1 root root 0 Jul 19 2011 /etc/cron.deny
[root@zetawiki ~]# cat /etc/cron.deny
[root@zetawiki ~]#
- cron.allow와 cron.deny 파일이 둘 다 존재하지 않는 경우, 루트 사용자 권한이 있는 사람만 crontab명령으로 작업할 수 있다.
- cron.allow 및 cron.deny 파일을 편집하거나 만들려면 수퍼유저(root) 권한이 필요하다.
crontab 생성, 편집, 표시, 제거 가능 | crontab 생성, 편집, 표시, 제거 불가능 | |
cron.allow (O) | cron.allow에 나열된 사용자만 | 나머지 |
cron.allw (X) cron.deny (O) |
cron.deny에 나열된 사용자를 제외한 모든 사용자 | cron.deny에 나열된 사용자 |
cron.allow (X) cron.deny (X) |
슈퍼유저 권한 필요(ex. root) | 슈퍼유저 제외 나머지 모두 |
- root계정으로 cron.allow 수정하여 해당 계정 추가(한 라인에 사용자 이름 하나씩)
- crontab 파일 권한 여부 확인 방법
#해당 사용자계정으로 로그인
crontab -l
crontab: can't open your crontab file
-> 1) crontab 파일 존재하는지 확인 필요 2) crontab 파일 권한 확인 필요
crontab: you are not authorized to use cron. Sorry.
-> 1) cron.allow 파일에 사용자 이름 등록 필요
- Crontab 사용 팁
1. 한 줄에 하나의 명령만 쓰자
# 잘못된 예
* * * 5 5
/home/script/test.sh
# 잘된 예
* * * 5 5 /home/script/test.sh
2. 필요할 때 주석을 달자
# 주석 #
#--------------------#
# 이것은 주석입니다. #
#--------------------#
3. 로그(log) 남겨두자
# 덮어쓰기
* * * * * /home/script/test.sh > /home/script/test.sh.log 2>&1
# 기존의 test.sh.log에 이어서 쓰기
* * * * * /home/script/test.sh >> /home/script/test.sh.log 2>&1
# 로그 확인
vi /home/script/test.sh.log
4. 주기적으로 백업하자
- 혹시라도 crontab -r 를 쓰거나 실수로 crontab 디렉토리를 날려버려서 기존 크론 내역들이 날아갔을 때를 방지하여 주기적으로 크론탭을 백업하자.
# 크론탭 내용을 txt 파일로 만들어 저장
crontab -l > /home/bak/crontab_bak.txt
# 크론탭 내용을 txt 파일로 만들어 저장 (자동화)
50 23 * * * crontab -l > /home/bak/crontab_bak.txt
- Crontab 사용 시 주의할 점
crontab의 규칙에 맞게 설정을 했음에도 불구하고 동작하는 않은 경우가 발생한다. 보통 아래의 이유 때문이다.
1. 환경변수
- SHELL
등록된 작업을 실행시킨 쉘을 지정한다**(크론탭은 실행시에 별도로 쉘을 띄운다)**. 지정하지 않을시 기본값으로 /bin/sh로 지정된다.
- PATH
쉘을 별도로 띄워서 실행하는 특성때문에, 쉘에서 프로그램을 찾기위한 PATH도 별도로 지정해줄 필요가 있다.
# 매분마다 sample.sh을 실행하며 프로그램이 작동할 쉘과 경로를 지정해준다.
crontab -e
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
* * * * * sample.sh
2. 권한문제
- vi /etc/crontab을 통해 크론탭을 직접 수정을 했을 경우 root 권한 명령을 실행하려면 root권한을 명시해 주어야 한다.
crontab -e
* * * * * example.sh
# 두 번째 처럼 root 권한을 명시해야 한다.
vi /etc/crontab
* * * * * root example.sh
3. 절대경로 / 상대경로
- 절대경로로 작성하여 나중에 생길 오류를 방지하자.
즉, /usr/local/bin/php74를 실행 시에는 php74 보다는 /usr/local/bin/php74로 절대 경로로 명시
4. 최소 반복 시간
- 크론탭의 최소 반복시간은 1분이므로 그보다 작은 시간으로 하면 안된다.
Reference
http://jdm.kr/blog/2#특정_시간_실행https://jhnyang.tistory.com/m/68https://jdm.kr/blog/2https://ojava.tistory.com/154
https://finance-it.tistory.com/106
https://zetawiki.com/wiki//etc/cron.allow,_cron.deny
'Programming > Linux' 카테고리의 다른 글
[Linux] rsync란? (0) | 2023.04.28 |
---|---|
[Linux] /tmp와 /var/tmp의 차이 (2) | 2023.03.11 |
[Linux] Nohup이란? (0) | 2023.03.10 |
[Linux] at이란? (0) | 2022.06.30 |