A. Crontab(크론탭)
1. 개요
특정 시간에 프로그램을 실행시키기 위해 사용하며, Windows 스케줄러와 비슷한 기능을 한다. 매일 혹은 정기적으로 실행해야 하는 예약작업이 있다. 리눅스에서는 이런 일을 해 주는 것이 cron이다. cron은 간단한 텍스트 파일에 할 일들을 기록하는데, 관리자인가 아닌가에 따라서 기록할 곳이 달라진다.
- 관리자 권한이 있다면 /etc/crontab 파일에 기록한다.
- 이 파일에 기록하면 한눈에 예약 작업을 확인할 수 있다는 장점이 있고, 명령을 실행할 사용자도 명시할 수 있다.
- 관리자 권한이 없다면 crontab -e 명령어를 실행해서 예약 파일을 편집한다.
- /etc/crontab 파일을 편집할 때와 달리 실행할 주체를 명시하는 부분이 없다.
2. root 권한 있는 경우 - /etc/crontab 편집
root 권한이 있는 경우 /etc/crontab 파일을 편집한다.
경로 : sudo vi /etc/crontab
**참고로 시스템 전반에 관여하는 크론탭으로 다른 크론탭과 달리 사용자명을 적는 필드가 있다.**
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
-> crontab에 대한 설명
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
- SHELL = cron을 실행할 쉘을 적어 주는 부분
- PATH = cron을 실행할 때의 $PATH다
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
-> 맨 밑의 4줄이 예약 작업 규칙과 명령어를 적어 주는 부분이며 탭 혹은 띄어쓰기로 구분한다.
# m h dom mon dow user command
-> 밑에서부터 5번째 줄을 보면 각 열의 의미를 설명한 주석이 보인다.
- 맨 앞의 다섯 열이 실행 시간 규칙을 적는 부분
- 그다음이 실행할 사용자를 적는 부분
- 그리고 그다음이 실행할 명령어를 적는 부분이다.
3. root 권한 없는 경우 - crontab -e
root 권한이 없는 경우에는 crontab -e를 실행한다.
환경변수에 에디터가 설정돼 있지 않으면 어떤 에디터를 쓸 거냐고 묻기도 한다.
nano를 추천한다고 씌어 있다. 터미널 에디터에 익숙지 않다면 나노를 사용하자.
나노는 저장하고 종료하려면 ctrl-x를 누른다. 변경사항이 있으면 저장할 거냐고 묻는데 y라고 쓰고 엔터 치면 된다.
우분투의 경우 crontab -e로 처음 들어가면 기본 설정이 나온다. 아무 예약 작업도 없고, 주석만 있다.
맨 아랫줄을 보면 m h dom mon dow command 하고 각 열을 설명하는 주석이 있는데,
/etc/crontab과 달리 username 열이 없다.
B. 크론탭 (Crontab) 옵션
crontab -l : 예약된 작업리스트
crontab -e : 예약된 작업 수정
crontab -r : 예약된 작업 삭제
crontab -u 사용자명 : 루트관리자는 해당 사용자 crontab 파일을 보거나 삭제, 편집 가능
1. 특수문자
- * : 모든 값을 뜻합니다.
- ? : 특정한 값이 없음을 뜻합니다.
- - : 범위를 뜻합니다. (예) 월요일에서 수요일까지는 MON-WED로 표현
- , : 특별한 값일 때만 동작 (예) 월, 수, 금 MON, WED, FRI
- / : 시작시간 / 단위 (예) 0분부터 매 5분 0/5
- L : 일에서 사용하면 마지막 일, 요일에서는 마지막 요일(토요일)
- W : 가장 가까운 평일 (예) 15W는 15일에서 가장 가까운 평일 (월 ~ 금)을 찾음
- # : 몇째 주의 무슨 요일을 표현 (예) 3#2 : 2번째 주 수요일
2. 주기 설정
- 공백(space)으로 5개 값을 구분하여 설정
- 요일에서 0과 7은 일요일
- 1이 월요일 ~ 6이 토요일
* * * * *
분(0-59) 시간(0-23) 일(1-31) 월(1-12) 요일(0-7)
분(0~59)을 설정. *을 설정한 경우 1분 단위로 실행
시간(0~23)을 설정. *을 설정한 경우 매시간 실행
일(1~31)을 설정. *을 설정한 경우 매일 실행
월(1~12)을 설정. *을 설정한 경우 매달 실행
요일(0~7)을 설정. *을 설정한 경우 월요일부터 일요일까지 매일 실행
3. 주기 설정 예시
# 매분 testfile.sh 실행
* * * * * /home/test/testfile.sh
# 특정 시간 실행
# 매주 금요일 오전 5시 45분에 testfile.sh 를 실행
45 5 * * 5 /home/test/testfile.sh
# 반복실행
# 매일 매시간 0분, 20분, 40분에 testfile.sh 를 실행
0,20,40 * * * * /home/test/testfile.sh
# 범위 실행
# 매일 1시 0분부터 30분까지 매분 testfile.sh 를 실행
0-30 1 * * * /home/test/testfile.sh
# 간격실행
# 매 10분마다 testfile.sh 를 실행
*/10 * * * * /home/test/testfile.sh
# 5일에서 6일까지 2시,3시,4시에 매 10분마다 testfile.sh 를 실행
*/10 2,3,4 5-6 * * /home/test/testfile.sh
예시 | 설명 |
* * * * * | 매일 매분마다 실행 |
5 * * * * | 매일 매시간 05분에 실행 |
*/5 * * * * | 매일 5분마다 실행 |
*/10 * * * * | 매일 10분마다 실행 |
0 18 * * * | 매일 18시 00분에 실행 |
15 18 * * * | 매일 18시 15분에 실행 |
* 1 * * * | 매일 01시 00분 ~ 01시 59분 사이에 매분마다 실행 |
0 */1 * * * | 매일 1시간 간격으로 실행 |
0 */12 * * * | 매일 12시간마다 실행 |
0 6,12 * * * | 매일 06시, 12시에 실행 |
5 3-5 * * * | 매일 03시 ~ 05시 사이 매시간 10분에 실행 (03시 05분, 04시 05분, 05시 05분) |
15 6 15 * * | 매달 15일 06시 15분에 실행 |
30 3 1,15 * * | 매달 1일과 15일 03시 30분에 실행 |
0 18 * * 1 | 매주 월요일 18시 00분에 실행 |
0 6,12 * * 0,3 | 수, 일요일마다 06시, 12시에 실행 |
0 21 * * 1-6 | 월 ~ 토 21시 00분에 실행 |
0 11 11 11 11 ? | 11월 11일 11:11마다 |
(크론표현식 사이트) Cron Maker : http://www.cronmaker.com/
4. 크론탭 로깅
크론탭 해당 처리 내역에 대해 로그로 남기고 싶을 때
* * * * * /home/test/testfile.sh > /home/test/testfile.sh.log 2>&1
# 매분마다 testfile.sh.log 파일이 갱신
* * * * * /home/test/testfile.sh >> /home/test/testfile.sh.log 2>&1
# 계속 로그가 누적이 되는 것을 확인
# 로그가 과도하게 쌓이면 리눅스 퍼포먼스에 영향을 주므로 가끔씩 비워주거나 파일을 새로 만들어줄 필요
반대로 로그는 필요 없는 크론
* * * * * /home/test/testfile.sh > /dev/null 2>&1
# 로그 필요 없는 크론
5. 크론탭 백업
크론탭 내용을 txt 파일로 만들어 저장
crontab -l > /home/bak/crontab_bak.txt
# 크론탭 내용을 txt 파일로 만들어 저장
59 23 * * * crontab -l > /home/bak/crontab_bak.txt
# 백업을 자동화
# 매일 오후 11시 59분에 크론탭을 백업해두는 크론
C. 사용자와 명령어
/usr/local/bin/script.sh를 매분 실행하게 한다고 가정하자.
/etc/crontab에 적는다면 아래처럼 적는다.
* * * * * www-data /usr/local/bin/script.sh
crontab -e로 적는다면 아래처럼 적는다.
* * * * * /usr/local/bin/script.sh
사용자를 명시했는지만 차이가 있다.
crontab -e의 실행 사용자는 작성자 자신이 된다.
실행 로그는 어디서 볼 수 있을까?
cron이 실행되면 /var/log/syslog에 실행이 됐다고 남는다.
실행 결과의 출력값이 syslog에 기록되는 것은 아니다.
명령어 실행 결과를 리디렉트 하지 않으면 cron은 결과를 메일로 보낸다.
서버에 메일 발송 시스템이 돼 있지 않다면 이메일 내용은 /var/mail/{사용자명} 파일에 기록되게 된다.
'Linux' 카테고리의 다른 글
RPM 개념 및 사용법 - 레드햇 패키지 설치 관리 도구 (0) | 2024.07.30 |
---|---|
rsyslog 개념 및 사용법 - 로그 수집, 분석, 모니터링 (0) | 2024.07.30 |
iptables 명령어 사용법 - 리눅스 상에서 방화벽 설정하기 (0) | 2024.06.04 |
rsync 명령어 사용법 - 데이터 백업하기 (0) | 2024.06.04 |
tcpdump 명령어 사용법 - 송수신되는 패킷 정보 출력하기 (0) | 2024.06.04 |