본문 바로가기
Dev/리눅스

리눅스에서 crontab 사용방법 쉽게 정리 및 예제

by bsion 2018. 8. 27.

개요


리눅스를 사용하다보면 주기적으로 반복하여 어떤 작업을 하고싶을 경우가 생긴다 (예: 매월 1일 12시에 데이터베이스 백업, 10분마다 파일 압축). 이런 경우에 가장 많이 쓰이는 모듈이 crontab 이다. 대부분 리눅스를 설치하면 기본적으로 설치되어있고, 부팅시 자동실행이 되어있다.




관리자 (root) 로 설정방법


모든 cron 들을 한눈에 관리하기 가장 편한 방법은 /etc/crontab 을 활용하는것이다. 편집기로 이 파일을 열면 초기상태에는 다음과같은 모양을 하고있다.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed


SHELL은 명령어를 실행시킬 shell script 종류

PATH 는 실행시킬 script 의 경로 (전체경로를 사용할경우 굳이 추가할 필요는 없다)


그리고 # 으로 시작하는 라인은 주석이다.


위 파일의 주석의 맨 아랫줄을 보면 * 5개가 있고 대쉬라인으로 해당 * 의 의미가 설명 되어있다.


crontab 은 띄어쓰기로 구분하여 한 줄에 총 7 개의 설정을 표기하는 문법이다.

순서대로 분 시 일 월 주 사용자이름 명령어 를 의미한다.


* 은 모든시간을 의미한다. 만약 분 tab 이 * 인 경우 매 1분마다 (0~59분) 이고, 월 탭이 1이면 매월마다 를 의미한다.



아래 예제로 쉽게 설명


예제1) 30분마다 명령어 실행

분   시   일   월   주  사용자 명령어
----------------------------------------
30   *    *    *    *   root   mkdir abc


예제2) 6시 00분 마다 명령어 실행

분   시   일   월   주  사용자 명령어
----------------------------------------
0    6    *    *    *   root   mkdir abc


에제3) 매월 11일 6시 00분 마다 명령어 실행

분   시   일   월   주  사용자 명령어
----------------------------------------
0    6    11   *    *   root   mkdir abc


예제4) 매월 11일, 25일 6시 00분 마다 명령어 실행

분   시   일     월   주  사용자 명령어
----------------------------------------
0    6    11,25   *    *   root   mkdir abc


예제5) 7월 1일 6시 00분 마다 명령어 실행

분   시   일   월   주  사용자 명령어
----------------------------------------
0    6    1    7    *   root   mkdir abc


만약 crontab으로 5분마다 명령어를 실행시키고 싶다면 어떻게 해야할까

아래처럼 할 수도 있다.

0,5,10,15,20,25,30,35,40,45,50,55   *    *    *    *   root   mkdir abc


그러나 이 방법으로 더 편하게 실행시킬 수 있다. 

예제6) 5분마다 명령어 실행

분   시   일   월   주  사용자 명령어
----------------------------------------
*/5   *    *    *    *   root   mkdir abc


예제7) 3시간마다 정각에 명령어 실행

분   시    일   월   주  사용자 명령어
----------------------------------------
0    */3    *    *    *   root   mkdir abc


이런식으로 원하고자 하는 설정을 이 파일에 적어두면 된다.

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name command to be executed

*/5 * * * * user2 mkdir abc


설정을 완료했으면 cron 을 재시작 시킨다.

[root@localhost Download]# service crond restart
Stopping crond:                                            [  OK  ]
Starting crond:                                            [  OK  ]


log 파일 (vi /var/log/cron)을 열어서 명령어가 작동되고 있는지 확인할 수 있다.

Aug 27 11:18:01 localhost CROND[24917]: (plex) CMD (/var/lib/plexmediaserver/Download/test.sh)
Aug 27 11:18:01 localhost CROND[24918]: (plex) CMD (/var/lib/plexmediaserver/Download/Filtering.py)
Aug 27 11:19:01 localhost CROND[24928]: (plex) CMD (/var/lib/plexmediaserver/Download/Filtering.py)
Aug 27 11:19:01 localhost CROND[24929]: (plex) CMD (/var/lib/plexmediaserver/Download/test.sh)
Aug 27 11:20:01 localhost CROND[24983]: (plex) CMD (/var/lib/plexmediaserver/Download/Filtering.py)


만약 문제가 발생면 친절히도 해당 사용자 메일로 오류를 보내준다.

You have new mail in /var/spool/mail/root [root@localhost Downloads]# tail -n 25 /var/spool/mail/root Return-Path: <root@localhost.localdomain> X-Original-To: root Delivered-To: root@localhost.localdomain Received: by localhost.localdomain (Postfix, from userid 496) id DCB642780733; Mon, 27 Aug 2018 11:15:01 +0900 (KST) From: root@localhost.localdomain (Cron Daemon) To: root@localhost.localdomain Subject: Cron <plex@localhost> python /var/lib/plexmediaserver/Download/Filtering.py Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated X-Cron-Env: <LANG=en_US.UTF-8> X-Cron-Env: <SHELL=/bin/bash> X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin> X-Cron-Env: <MAILTO=root> X-Cron-Env: <HOME=/> X-Cron-Env: <LOGNAME=plex> X-Cron-Env: <USER=plex> Message-Id: <20180827021501.DCB642780733@localhost.localdomain> Date: Mon, 27 Aug 2018 11:15:01 +0900 (KST) File "/var/lib/plexmediaserver/Download/Filtering.py", line 27 os.rename(filename, filename.replace(".E",".S01.E") # make season name to be detected in plex ^ SyntaxError: invalid syntax [root@localhost Downloads]#

앗, 실수로 파이썬 스크립트에서 괄호를 덜 닫았다.




개별사용자 권한으로 실행하고자 할 경우


만약 관리자가 아닌 일반 유저일 경우 다음과 같이 cron 파일을 생성시킬 수 있다.

[user1@localhost ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab


명령어를 실행시키면 새 파일이 기본 편집기모드로 열리는데, 이곳에 위에 설명한 문법으로 작성해두면 된다.


단, 관리자가 해당 유저가 cron 을 사용할 수 있는 권한을 부여해야 한다. 이 파일에 아이디를 적어두면 권한을 추가 시킬 수 있다. /etc/cron.allow



댓글