Linux Crontab 사용법

  • 이번 포스트에서는 리눅스 크론탭에 대해 알아볼 것이다.
  • 윈도우에서는 스케줄러와 비슷하다고 생각하면 된다.

crontab 기본명령어


  • 명령어 위치 : /usr/bin/crontab
  • ps -ef|grep crond
    • crond 실행되고 있는지 확인
  • crontab -e
    • 크론탭 에디터 실행
    • 여기에서 크론탭 설정, 수정
    • 편집하려면 root 권한 필요(root권한 없다면, sudo crontab -e)
  • crontab -l
    • 등록되어 있는 crontab 목록 출력
  • crontab -r
    • 등록한 crontab 모두 삭제
  • crontab -v
    • 수정한 크론탭 파일 내용 조회(일부 시스템에서만 사용 가능)
  • 사용자가 등록한 crontab은 [리눅스 : /var/spool/cron/사용자명]에 저장됨

등록형식


* * * * * (왼쪽부터 분, 시, 일, 월, 요일)

  • 1번째 * : 분 (0 - 59)
  • 2번째 * : 시 (0 - 23)
  • 3번째 * : 일 (1 - 31)
  • 4번째 * : 월 (1 - 12)
  • 5번째 * : 요일 (0 - 6) (0:일요일, 1:월요일, 2:화요일, …, 6:토요일)

예시


1) * * * * * /home/script/test.sh

  • 매 1분마다 /root/test.sh를 수행(하루에 1440회)

2) 15, 45 * * * * /home/script/test.sh

  • 매시 15분, 45분에 /home/script/test.sh를 수행(하루에 48회)

3) */10 * * * * /home/script/test.sh

  • 10분마다 /home/script/test.sh를 수행(하루에 144회)

4) 0 2 * * * /home/script/test.sh

  • 매일 02:00에 /home/script/test.sh를 수행 (하루에 1회)

5) 30 */6 * * * /home/script/test.sh

  • 매 6시간마다 30분에 수행(00:30, 06:30, 12:30, 18:30)

6) 30 1-23/6 * * * /home/script/test.sh

  • 1시부터 매 6시간마다 30분에 수행(01:30, 07:30, 13:30, 19:30)

7) 0 8 * * 1-5 /home/script/test.sh

  • 평일(월요일~금요일) 08:00에 수행

8) 0 8 * * 0,6 /home/script/test.sh

  • 주말(일요일, 토요일) 08:00에 수행

크론탭 백업


  • 주기적으로 크론탭 백업 필요
    • crontab -l > /home/bak/crontab_bak.txt
    • 크론탭 내용을 txt 파일로 만들어 저장해둔다.
  • 매일 오후 10시 30분에 크론탭 백업
    • 30 22 * crontab -l > /home/bak/crontab_bak.txt

작업에 대한 로그 남기는 방법


  • cron job들은 자동 수행되므로, 별도 작업 로그를 남기지 않으면 해당 작업의 정상 수행 여부 확인이 어렵다.
  • cron job 수행 여부 자체는 시스템 로그에 남기 때문에(ubuntu의 경우 /var/log/syslog 파일에서 확인) 볼 수 있으나,
  • 실제 해당 job이 실행되면서 job에 발생시키는 로그는 추가 기록이 필요하다.
  • cron job 등록 시, 아래 명령어 사용하면 로그 파일 남길 수 있다.
    1
    0 0 * * * /some/job > ~/log/job_`date +\%Y\%m\%d\%H\%M\%S`.log 2>&1

로그파일의 파일 이름에 실행된 날짜/시간 넣는 방법

  • data 명령어 이용 시 지정한 포메터대로 현재 시간 출력 가능
  • 쉘 스크립트에서 문자를 이용하여 명령어를 감싸면 해당 명령어의 stdout 을 return해주는데 이를 이용하여 파일이름을 정해줄 수 있다.
  • 로그 파일명을 다음과 같이 지정한 경우 job_date+\%Y\%m\%d\%H\%M\%S.log 실제 파일명은 job_20190623201123.log와 같이 시간값으로 치환되어 결정된다.

/some/job 의 출력(stdout)을 로그 파일로 리디렉션

  • 리디렉션 기호인 > 를 이용하여 stdout을 파일로 기록하려면 다음과 같이 하면 된다.
  • 해당 로그 파일에 overwrite를 하고 싶다면,

    1
    /some/job > ~/log/job_`date+\%Y\%m\%d\%H\%M\%S`.log
  • 해당 로그파일의 기존 내용을 보존하면서 append를 하고 싶다면,

    1
    /some/job >> ~/log/job_`date+\%Y\%m\%d\%H\%M\%S`.log

/dev/null 의 의미

  • 위에서 알아본 것과 반대로 작업 로그가 필요 없다고 생각되는 경우는 /dev/null로 redirect를 해주면 된다.
  • /dev/null로 들어오는 입력은 모두 버려진다.

마지막 2>&1 의 의미

  • 1 : stdout
  • 2 : stderr
  • > : redirection
  • 2>&1 : stderr를 stdout으로 리디렉션해서 stdout과 동일하게 처리