본문 바로가기
Linux

리눅스 crontab 등록했는데 실행 안 될 때: 원인 찾는 점검 순서 (Ubuntu 24.04, 2026년 9월 16일 확인)

by 바른정보블로그 2026. 9. 16.

리눅스 crontab 등록했는데 실행 안 될 때 원인 점검 순서 Ubuntu 24.04 대표 이미지

crontab -e로 등록했는데 시간이 지나도 아무 일이 없을 때가 있습니다. cron은 실패해도 화면에 아무것도 띄우지 않아 원인을 순서대로 좁혀야 합니다. 이 글은 Ubuntu 24.04(기본 cron 패키지) 기준으로 공식 man 페이지 내용만 근거로 정리했습니다. 확인 날짜는 2026년 9월 16일입니다.

3줄 요약

  • 흔한 원인은 사용자 필드 오기입, % 미이스케이프, PATH 차이 세 가지입니다.
  • cron은 출력을 메일로 보내므로 >> 로그파일 2>&1로 파일에 남겨야 원인이 보입니다.
  • Ubuntu 기본 cron은 사용자별 타임존을 지원하지 않습니다(CRON_TZ는 다른 패키지 기능).

원인별 빠른 점검표

증상 확인할 것 근거
아무 반응 없음 crontab -l에 줄이 보이는지 crontab(1)
줄은 있는데 실행 안 됨 개인 crontab에 사용자 이름을 넣었는지 crontab(5)
명령 일부만 실행 명령에 %가 들어갔는지 crontab(5)
"command not found" 명령을 절대 경로로 썼는지 crontab(5) 환경 변수
마지막 줄만 무시됨 파일이 개행으로 끝나는지 crontab(1) DIAGNOSTICS
/etc/cron.d 파일이 무시됨 파일 이름에 점(.)이 있는지 cron(8), run-parts(8)
지정 시각이 지났는데 안 돎 그 시각에 PC가 켜져 있었는지 crontab(5)

점검 순서

  1. 등록 확인: crontab -l을 실행합니다. 다른 계정이면 sudo crontab -u 계정명 -l로 봅니다. su로 전환한 상태라면 -u를 꼭 붙이라고 man 페이지가 권고합니다.
  2. 데몬 확인: systemctl status cron으로 동작 여부를 봅니다. cron은 1분마다 변경을 확인하므로 재시작할 필요는 없습니다.
  3. 사용자 필드: 개인 crontab(crontab -e)에는 사용자 이름을 쓰지 않습니다. /etc/crontab/etc/cron.d에만 시간 뒤에 사용자 필드가 들어갑니다. 개인 crontab에 계정명을 넣으면 그 이름을 명령으로 실행하려다 실패합니다.
  4. % 이스케이프: man 페이지는 "명령 안의 %는 백슬래시로 막지 않으면 개행으로 바뀌고 첫 % 뒤는 표준 입력으로 전달된다"고 적고 있습니다. date +%Ydate +\%Y로 씁니다.
  5. 출력 확보: 실행 줄 끝에 >> /tmp/myjob.log 2>&1을 붙입니다. cron은 출력을 crontab 소유자에게 메일로 보내므로(MAILTO), 메일 환경이 없으면 에러를 볼 수 없습니다.
  6. 환경 확인: * * * * * env > /tmp/cronenv 2>&1을 1분만 걸고 결과를 봅니다. cron은 SHELL·HOME·LOGNAME을 자동 설정하고 PATH는 환경에서 상속하므로 로그인 셸과 값이 다를 수 있습니다. 명령은 절대 경로로 쓰세요.
  7. 로그 확인: cron은 syslog의 cron 파실리티로 기록합니다. grep CRON /var/log/syslog 또는 journalctl -t CRON으로 봅니다. /etc/default/cron에서 실행 옵션에 -L 15를 더하면 시작·종료·실패·PID까지 남습니다.
  8. 파일 형식: crontab은 마지막 줄이 개행으로 끝나야 설치됩니다. 명령·환경 변수와 같은 줄에 주석을 달 수 없고, 환경 변수는 아래 줄에만 적용됩니다.
  9. /etc/cron.d 규칙: root 소유에 그룹·타인 쓰기 권한이 없어야 합니다. 이름은 영문·숫자·밑줄·하이픈만 허용되며 점이 든 파일은 조용히 무시됩니다. /etc/crontab의 환경 변수도 상속하지 않습니다.
  10. 사용 권한: /etc/cron.allow가 있으면 그 목록에 있어야 하고, /etc/cron.deny만 있으면 그 목록에 없어야 합니다. 둘 다 있으면 cron.allow가 우선합니다.

주의사항

  • Ubuntu 기본 cron은 사용자별 타임존을 지원하지 않습니다. TZ는 실행되는 명령에만 영향을 주고 실행 시각은 시스템 타임존을 따릅니다.
  • 스풀(/var/spool/cron/crontabs) 파일을 직접 편집하지 말고 crontab 명령으로 다루세요.
  • 계정 이름이 바뀌면 그 계정의 cron 작업은 실행되지 않습니다.
  • 시스템 기본 작업은 이른 아침에 돌므로 그때 PC가 꺼져 있으면 시간 단위 작업 외에는 실행되지 않습니다. anacron이 설치돼 있으면 놓친 일·주·월 작업을 뒤늦게 대신 실행합니다.
  • GUI 프로그램은 DISPLAY 환경 변수를 직접 지정해야 돕니다.

그래도 안 될 때 추가 점검

  1. 스크립트 문제: bash /경로/스크립트.sh를 터미널에서 직접 실행합니다. 여기서 실패하면 cron 문제가 아닙니다.
  2. 실행 권한: /etc/cron.hourly·daily·weekly·monthly 파일은 실행 권한이 필요하지만 /etc/cron.d 파일은 설정 파일이라 필요 없습니다.
  3. 요일·일 중복: 날짜와 요일을 둘 다 지정하면 하나만 맞아도 실행됩니다. 의도보다 자주 도는 원인입니다.
  4. 명령 길이: 명령 필드는 최대 998자입니다.

자주 묻는 질문

Q1. crontab을 고쳤는데 cron을 재시작해야 하나요?
아니요. cron은 매분 스풀과 /etc/crontab의 수정 시각을 확인해 바뀐 파일을 다시 읽습니다.

Q2. 로그가 /var/log/syslog에 없습니다.
설정에 따라 syslog 파일이 없을 수 있습니다. journalctl -t CRON으로 확인하고, 그래도 부족하면 출력을 파일로 리다이렉션해 직접 남기세요.

Q3. CRON_TZ를 쓰면 되지 않나요?
CRON_TZ는 cronie 계열 기능입니다. Ubuntu 기본 cron 문서는 "사용자별 타임존을 지원하지 않는다"고 명시하므로, 시스템 시각으로 걸고 스크립트 안에서 시간을 판별하는 편이 안전합니다.

함께 보면 좋은 글

공식 출처

댓글