치춘짱베리굿나이스

crontab 사용하기 본문

UNIX 환경/Shell

crontab 사용하기

치춘 2022. 7. 20. 02:50

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 작업 생성 및 관리

리눅스 크론탭 기본(Basic of crontab)

리눅스 크론탭(Linux Crontab) 사용법

$USER environment variable is undefined when running script from crontab

 

'UNIX 환경 > Shell' 카테고리의 다른 글

쉘 스크립트 문법  (0) 2021.03.21
쉘 & 쉘스크립트 정리  (0) 2021.03.21
Comments