치춘짱베리굿나이스
crontab 사용하기 본문
crontab
현재 환경에서 특정 주기마다 무언가 스크립트같은 것을 실행시키고 싶을 때 사용하는 명령이다
우분투에서 연습했지만 지금 보니 macOS의 zsh에도 내장되어 있더라 (유닉스 기반 스케줄러라 그런가보다)
쉘 스크립트를 작성하고, 이것을 어느 주기마다 실행시킬 것인지 지정할 수 있다
주로 서버에서 특정 시간마다 로깅을 할 때 사용하지만 나는 내 생일때마다 스크립트로 생일축하합니다 같은 거 출력할 생각밖에 안 하고 있다…
특징
- 해당 명령어가 기본적으로 사용하는 쉘은
sh
이다bash
등 다른 쉘을 쓰고 싶다면 사전 설정을 해주어야 한다sh
를 쓰는 특성상source
등의 명령어는 사용할 수 없다 (설정으로 쉘을 바꿔주면 가능하다)
- 특정 분, 시간, 일, 달, 요일마다 명령을 수행하거나, 기간을 설정해줄 수도 있다
- 어떠한 설정도 해주지 않을 경우 (기본값:
* * * * *
) 매 분마다 실행된다
- 어떠한 설정도 해주지 않을 경우 (기본값:
- 사용자의 터미널과 독립적으로 동작하기 때문에, 환경변수 등을 사용하지 못하거나 경로에 문제가 생길 수 있다
crontab
은 명령어를 실행시킬 때마다 새로운 쉘을 켜고, 명령어를 실행시키고, 꺼 버리는 루틴을 반복하기 때문에 환경변수가 영원히 지속되지 않는다- 따라서 환경변수를 추가하거나 값을 변경해도 사용자의 터미널과는 전혀 관계없이 움직인다
crontab
이 매번 실행될 때마다 환경변수를 유지하고 싶으면 임시 파일을 사용하거나 별도의 스크립트와 연동하자- 경로는 어지간하면 절대경로를 쓰는 것이 좋다 (경로, 환경변수, 권한 문제가 매우 많이 일어난다)
- 기본적으로 명령 수행 결과를 화면에 출력하지 않고, 메일로 보내준다
- 화면에 출력하고 싶다면
wall
명령어를 파이프로 붙이는 등 변칙적으로 사용하여야 한다 - 보통은 리디렉션 (
>
,>>
) 을 이용하여 다른 파일 (로그 등) 저장하는 방식을 활용한다
- 화면에 출력하고 싶다면
- 명령어를 여러 줄에 걸쳐 작성할 수 없다
- 여러 명령어를 합쳐서 길게 써야 할 경우, 스크립트 파일 (
.sh
) 을 작성하고 그것을 실행시키게끔 하자
- 여러 명령어를 합쳐서 길게 써야 할 경우, 스크립트 파일 (
- 최소 반복 시간은 1분으로, 더 짧게 할 순 없다
명령어
명령어 개수가 적고 매우 간단하다
예약 작업 생성 및 수정
$> crontab -e
- 현재 로그인된 계정에 대해 새로운 예약 작업을 생성한다
- 기존의 예약 작업을 수정할 수도 있다
예약 작업 리스트 확인
$> crontab -l
- 현재 로그인된 계정의 작업 리스트를 출력한다
예약 작업 전체 삭제
$> crontab -r
- 현재 계정에 대해 모든 예약 작업을 삭제한다
특정 유저의 예약 작업 생성 및 수정
$> crontab -u [유저명]
- 인자로 받은 유저의 예약 작업을 편집한다
- 루트 권한 사용자는 모든 유저의 작업을 편집할 수 있다
설정할 수 있는 환경변수
SHELL
SHELL=/bin/bash
crontab
에서 사용하는 쉘은 기본적으로 sh이므로, 다른 쉘을 사용하고 싶다면 그 경로를 지정한다- 쉘마다 사용할 수 있는 명령어가 차이가 있기 때문에 잘 보고 쓰는 것이 좋겠다
MAILTO
MAILTO="foo@bar.com"
crontab
은 기본적으로 예약된 주기마다 예약된 명령을 실행하고, 그 결과를 메일로 보내준다- 이때의 메일 주소를 저장할 수 있는데, 빈 문자열로 지정하면 메일을 보내지 않는다
- 메일 주소에 오류가 있을 경우
crontab
이 정상적으로 동작하지 않을 가능성이 있다
- 메일 주소에 오류가 있을 경우
- 기본값은 해당 스케줄을 설정한 주체 (유저) 의 이메일로 되어있다
PATH
PATH=/sbin:/bin:/usr/sbin:/usr/bin
- 위에 설명했듯
crontab
은 현재의 환경에 명령어를 실행시키는 것이 아닌, 별개의 쉘을 열어 명령을 수행하기 때문에$PATH
환경변수의 값도 다를 여지가 있다 /usr/bin
같은 기본적인 명령어가 들어있는 디렉토리는 영향을 안 받을 수 있으나, 다른 프로그램 등을 설치하여 PATH가 수정되었을 경우,crontab
도 맞춰주지 않으면 명령 수행을 실패할 수 있다- 명령어를 찾을 경로를 절대경로로 작성하여
crontab
이 명령어를 찾을 수 있도록 도와주자
HOME
HOME=/home/foo
crontab
의 홈 경로를 설정한다- 일반 환경변수인
$HOME
과 비슷하다고 보면 된다 - 기본값은 해당 스케줄을 설정한 주체 (유저) 의 홈 경로로 되어있다
사용법
기본적인 설정
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
SHELL=/bin/bash # 환경변수
MAILTO="" # 환경변수
# m h dom mon dow command 작업 스케줄 형식
* * * * * source ~/cpu.sh # 작업 스케줄
crontab -e
명령어를 입력하면 위와 같은 입력창이 나올 것이다- 환경변수 (
SHELL
,MAILTO
,PATH
,HOME
) 를 상단에 설정하고, 하단에 스케줄을 추가한다 - 작업 주기 다음에 수행하고자 하는 명령을 적으면 된다
스케줄 형식 (Cron Expression)
# crontab -e
# ┌───────────── min (0 - 59)
# │ ┌────────────── hour (0 - 23)
# │ │ ┌─────────────── day of month (1 - 31)
# │ │ │ ┌──────────────── month (1 - 12)
# │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to Saturday, or use names; 7 is Sunday, the same as 0)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * command to execute
- 왼쪽 끝부터 순서대로 분, 시, 일, 월, 요일을 의미한다
- 실제 크론식은 숫자와 연도도 세지만
crontab
에선 일단 패스한다 - 요일은 일요일이 0으로 시작하여 토요일까지 1씩 증가하고, 마지막의 7도 일요일로 쳐준다
- 실제 크론식은 숫자와 연도도 세지만
*
: 기본값 (asterisk), ‘매 번' 을 의미한다- 1분, 1시간, 1일, … 에 한 번씩 수행된다고 생각하면 된다
?
: 설정값이 없을 때 사용한다- 일 (왼쪽에서 3번째), 요일 (오른쪽 끝) 에만 사용할 수 있다
/
: 값 증가 표현에 사용된다0/10 * * * *
는 ‘0분부터 시작하여 매 10분마다 (10분, 20분, 30분, 40분 …) 를 의미한다*/10 * * * *
는 ‘지금부터 매 10분마다’ 를 의미한다
-
: 언제부터 언제까지를 의미한다10-30 * * * *
는 매 10분부터 30분까지를 의미한다
,
: 여러 시간을 동시에 선택할 수 있다0 5,15 * * *
는 5시 정각, 15시 정각을 의미한다
오류 여부 확인하기
$> sudo cat log /var/log/syslog | grep CRON
crontab
은 별도의 에러 메시지 등을 남기지 않기 때문에 작업 수행이 되지 않아도 어디가 문젠지 알기 힘들다- 시스템 로그를
cat
으로 열어 그 중CRON
과 관련된 로그만 따오는 식으로 오류 여부를 알 수 있다
참고자료
Cron Expression 정리 - 스케쥴러 개발을 위한 Cron 표현식
[Linux] crontab 명령어 사용법 - cron 작업 생성 및 관리
$USER environment variable is undefined when running script from crontab
'UNIX 환경 > Shell' 카테고리의 다른 글
쉘 스크립트 문법 (0) | 2021.03.21 |
---|---|
쉘 & 쉘스크립트 정리 (0) | 2021.03.21 |
Comments