crontab?
cron
- 주기적으로 특정 작업(프로그램, 서비스) 을 실행하는 스케줄러
crond
- cron 데몬 프로세스
crontab
- cron 을 위한 테이블
- 어떤 프로그램을 어떤 간격으로 실행할 지 적혀있음
crontab 문법
분 시 일 월 요일 실행할_명령어-
참고 : 실행할 명령어의 파일 위치는 절대경로로 해야한다
- 왜냐면 셸 환경을 가져온 뒤에 실행하는게 아니기 때문에, PATH 설정이 적용되어있지 않음
-
예시
0 2 * * * /usr/local/bin/backup.sh- 매일 02:00 에 backup.sh 파일 실행
*/5 * * * * /usr/bin/python3 /app/monitor.py- 5분마다 monitor.py 파일 실행
0 9 * * 1-5 /home/user/report.sh- 월요일부터 금요일까지 09:00 에 reporth.sh 파일 실행
@reboot /home/user/report.sh-
시스템이 켜질 때 마다 report.sh 파일을 실행
-
특수 문자열은 아래와 같다
| 문자열 | 의미 |
|---|---|
@reboot | 시스템 부팅 시 |
@hourly | 매시간 |
@daily | 하루 1회 |
@weekly | 주 1회 |
@monthly | 월 1회 |
- 참고 - 요일과 날짜가 같이 있으면 그건 or 조건으로 작동한다.
시스템 cron
- 시스템 cron은 아래의 위치에 있음
| 경로 | 설명 |
|---|---|
/etc/crontab | 시스템 전역 설정 |
/etc/cron.hourly/ | 매시간 실행 |
/etc/cron.daily/ | 매일 실행 |
/etc/cron.weekly/ | 매주 실행 |
/etc/cron.monthly/ | 매월 실행 |
- 참고 : /etc/crontab의 경우 사용자도 명시해줘야 함
분 시 일 월 요일 사용자 명령어권한
- 사용자 cron으로 실행하는 경우에는, 실행하려는 사용자가 실행하려는 프로그램의 “실행 권한(x)” 이 있어야지만 작동한다.
로그
- 실행 결과는 기본적으로는 MTA를 통해 메일로 감
- 그러나 여기서는 메일 대신에 로그 파일을 만들어서 저장해볼것
0 2 * * * /script.sh >> /var/log/script.log 2>&1 -
참고
-
: 이어쓰기
-
: 덮어쓰기
- 2 : 표준 오류
- 1 : 표준 출력
- & : 참조
- 2>&1 : 표준 오류를 표준 출력과 같은 곳으로 보낸다
-
-
출력의 흐름
/script.sh
├─ stdout ─┐
└─ stderr ─┴─>> /var/log/script.log명령어 사용 예시
*/15 9-18 * * 1-5 /usr/local/bin/report.sh- 매 주 월요일부터 금요일까지
- 오전 9시부터 저녁 6시까지
- 00분부터 15분 간격으로
- /usr/local/bin/report.sh 파일을 실행함
0 0 1 * * /backup/monthly.sh- 매 달 1일 00시 00분에
- /backup/monthly.sh 파일을 실행함
30 23 * * 0 /cleanup/log_clean.sh- 매 주 일요일 23시 30분에
- /cleanup/log_clean.sh 파일을 실행함
@reboot /opt/app/start.sh- 컴퓨터를 껐다가 킬 때마다
- /opt/app/start.sh 파일을 실행함
5 */2 10-20 3,9 * /script.sh- 3월과 9월에
- 10일부터 20일까지
- 짝수 시간 5분에 (ex. 02:05, 04:05, 06:05)
- /script.sh 파일을 실행함
예시 시나리오
상황
- 아래의 프로그램이 이미 동작한다고 가정함
/usr/local/bin/check_log_usage.sh
요구사항
-
평일(월~금) 에만 실행
-
업무 시간에만 실행
- 오전 9시 ~ 오후 6시
-
10분마다 실행
-
출력은 전부
/var/log/check_log_usage.log로 남길 것 -
기존 로그는 유지 (덮어쓰기 ❌)
-
메일 전송은 사용하지 않음
정답
MAILTO=""
*/10 9-18 * * 1-5 /usr/local/bin/check_log_usage.sh >> /var/log/check_log_usage.log 2>&1참고
0 0 * * 1 /script.sh >> /var/log/a.log
0 0 * * 1 /script.sh >> /var/log/b.log- 위와 같은 내용이 crontab에 있을 때,
- 두 스크립트는 순차적으로 작동하지 않는다는 점을 알아야 한다.
- → 무조건 a에 먼저 적히고, 그 뒤에 b에 적히는게 아님. 때에 따라 다름