티스토리 뷰

간혹 shell에서 직접 실행하면, 정상적으로 잘 동작하는 스크립트가 crontab에 등록하면 정상적을 동작하지 않는 경우가 발생하곤 합니다. 대부분 shell의 환경 변수와 crontab의 환경 변수가 달라서 발생을 하게 됩니다. 스크립트 내에서 외부 명령어를 실행하는 경우에 PATH 환경변수가 달라서 명령어 위치를 찾지 못해서 에러가 발생하는 경우가 대표적인 예입니다. 이런 문제를 해결하기 위해서 crontab 실행 시 환경 변수를 맞춰서 실행하는 방법을 소개합니다.

 

환경 변수 확인

현재 로그인된 shell의 환경 변수 값을  확인 하는 방법은 set 명령어를 이용하면 확인 할 수 있습니다.

# set |egrep '^PATH'
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

/etc/crontab 수정

/etc/profile, /etc/profile.d/* 설정을 통해서 shell 로그인시 환경변수를 수정할 수 있는 것처럼, /etc/crontab 파일에서 crontab 실행 환경 변수 설정을 할 수 있습니다. 

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

# 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

위 설정은 crontab 전역 설정이라고 보면되는데, crontab은 설정 순서

crontab 실행 시 환경 변수 지정

crontab 설정의 실행 명령에 환경변수를 포함하여, 실행할 수 있습니다. 예를 들어 /root/backup.py 스크립트에서 /usr/local/bin/rsync 명령어를 사용하여 파일 싱크를 해야 한다면,

import os

os.system("rsync -a /home /home_backup")

crontab 실행 시에 PATH=/usr/local/bin을 앞에 넣어서 실행하게 되면, /usr/local/bin/rsync 절대 경로가 아닌 rsync 로만 실행을 한경우에도 /usr/local/bin/rsync가 실행되게 됩니다.

0 5 * * * PATH=/usr/local/bin /root/backup.py

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
페이지
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함