Linux에서 Crontab 사용 초보자 가이드

2024. 1. 16. 08:37잡학

728x90

linux crontab

Linux 일정(시간) 작업 실행 등록 - crontab

특정 시간 / 주기를 등록 하여 원하는 작업을 자동으로 실행시켜 주는 linux 전용 작업 스케쥴러를 crontab이라고 합니다.

crontab 등록된 작업들은 commend (shell)이 실행 여부와 상관없이 동작하기 때문에 서버 등을 운영할 때 편리합니다.

< crontab 리스트 확인 >

crontab -l

현재 등록된 스케쥴의 리스트를 확인할 수 있습니다.

* 없으면 no crontab for <user명 >을 출력하며 끝납니다.

 

< crontab schedule 등록 >

crontab -e

스케쥴의 등록 형식은 다음과 같습니다.

각 *에 해당하는 부분이 분,시,일,월,요일 등을 기재할 수 있으며

그대로 *을 적어놓으면 해당 시간열에 존재하는 모든 숫자를 포함

 

< crontab 구문 >

m h d mon dow [flags] command

시간 간격은 cron에 명령 실행 빈도를 알려줄 수 있는 5자리 필드입니다. 이는 모든 cron 구현의 핵심 기능이며 cron이 반복 작업을 처리하는 방법을 구체적이고 유연하게 지정할 수 있습니다.

  • m = 0에서 59 사이의 분
  • h = 0에서 23 사이의 시간
  • d = 1에서 31 사이의 날짜
  • mon = 1에서 12 사이의 월
  • dow = 0에서 6 사이의 요일. 0은 일요일입니다.

 flags필드는 단일 명령에 대해 cron이 작동하는 방식을 수정하는 옵션 세트입니다. 

예를 들어 -ncron이 시스템 메일을 보내는 것을 중지하는 옵션을 포함할 수 있습니다.

 

 command필드는 cron이 설정된 간격으로 실행되는 명령입니다. 

이는 사용자가 작성한 쉘 스크립트이거나 플래그가 있는 프로그램 경로일 수 있습니다.

 

단일 crontab line에서 이 모든 것을 함께 사용하여 작업에 대한 특정 시간 간격을 만들 수 있습니다. 

예를 들어, 다음 crontab line을 작성 매년 7월 24일 오전 2시 30분에 Ubuntu 시스템에서 스크립트를 실행할 수 있습니다.

30 2 24 7 * /home/$USER/myscript.sh

 

< crontab 실행이 안되는 경우 >

설정을 했으나 작동이 안되는 경우가 발생합니다.

커맨드 창에서는 crontab의 작동의 유무를 확인할 수 없으므로 스케쥴 등록후  확인은 반드시 해야합니다.

만약 실행되지 않는 경우 확인 방법에 대해 알아 보겠습니다.

 

1. 특정파일이 정상적인 경로로 등록되었는지 확인

파일을 실행시킬 때 절대경로와 상대경로 모두 가능

crontab / (최상위 경로)에서 명령을 실행한다고 가정하고 반드시 절대 경로로 등록해주는 걸 권장한다.

즉 crontab 등록시키기 전에 해당 명령어를 / 경로에서 실행시켜 보고 등록

 

2. 환경 변수 

crontab 명령어 실행시 완전히 별도의 shell을 띄워 실행하므로 관련된 환경변수 설정해야 합니다.

만약 해당 프로그램이 등록된 환경변수를 작업을 수행해야 할 경우

crontab -e 실행 스케쥴 목록 상단에 환경 변수를 미리 등록

crontab 환경변수 이미지

 

3. 사용 환경 / linux timezone 일치하는지 확인

AWS를 사용하는 경우 crontab 사용시 지금 문제가 발생한다.

crontab 자체는 정상적으로 동작하고 있지만 시간대가 다른 시간에서 작동을 합니다.

첨부 이미지에서 localtime / timezone 정보를 동일하게 수정

4. log를 통해 실행에 문제가 된 원인 확인

/var/log/cron  ( log 확인 )

스케쥴 등록 된 작업자체의 Error 발생

timezone 다르거나 / 등록 형식 자체 오류 이 경우 crontab 오류로 실행이 안되고 있지만 log 기록이 안됩니다.

 

< crontab 작동 확인 >

tail -f /var/log/cron

 

Jan  5 11:23:51 서버명 crontab[299045]: (root) END EDIT (root)

Jan  5 11:24:01 서버명 crond[13250]: (root) RELOAD (/var/spool/cron/root)

Jan  5 11:28:01 서버명  CROND[299186]: (root) CMD (실행파일.sh)

Jan  5 11:29:01 서버명  CROND[299216]: (root) CMD (실행파일.sh)

Jan  5 11:30:01 서버명  CROND[299255]: (root) CMD (실행파일.sh)

Jan  5 11:30:01 서버명  CROND[299256]: (root) CMD (/usr/lib64/sa/sa1 1 1)

Jan  5 11:31:01 서버명  CROND[299289]: (root) CMD (실행파일.sh)

Jan  5 11:32:01 서버명  CROND[299321]: (root) CMD (실행파일.sh)

Jan  5 11:33:01 서버명  CROND[299352]: (root) CMD (실행파일.sh)

Jan  5 11:34:01 서버명  CROND[299381]: (root) CMD (실행파일.sh)

Jan  5 11:35:01 서버명  CROND[299410]: (root) CMD (실행파일.sh)

 

위의 예제처럼 현재 실행 되고 있는 crontab 스케쥴 작업 모니터링 할 수 있습니다.

 

< crontab schedule 삭제 >

모든 스케쥴을 삭제 명령어

 

$ crontab -r

 

crontab -e를 실행하여 에디터로 스케쥴을 직접 삭제해도 문제가 없습니다.

 

728x90
반응형
LIST