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

요구사항

  1. 평일(월~금) 에만 실행

  2. 업무 시간에만 실행

    • 오전 9시 ~ 오후 6시
  3. 10분마다 실행

  4. 출력은 전부 /var/log/check_log_usage.log 로 남길 것

  5. 기존 로그는 유지 (덮어쓰기 ❌)

  6. 메일 전송은 사용하지 않음

정답

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에 적히는게 아님. 때에 따라 다름