
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) |
점검 순서
- 등록 확인:
crontab -l을 실행합니다. 다른 계정이면sudo crontab -u 계정명 -l로 봅니다.su로 전환한 상태라면-u를 꼭 붙이라고 man 페이지가 권고합니다. - 데몬 확인:
systemctl status cron으로 동작 여부를 봅니다. cron은 1분마다 변경을 확인하므로 재시작할 필요는 없습니다. - 사용자 필드: 개인 crontab(
crontab -e)에는 사용자 이름을 쓰지 않습니다./etc/crontab과/etc/cron.d에만 시간 뒤에 사용자 필드가 들어갑니다. 개인 crontab에 계정명을 넣으면 그 이름을 명령으로 실행하려다 실패합니다. - % 이스케이프: man 페이지는 "명령 안의
%는 백슬래시로 막지 않으면 개행으로 바뀌고 첫%뒤는 표준 입력으로 전달된다"고 적고 있습니다.date +%Y는date +\%Y로 씁니다. - 출력 확보: 실행 줄 끝에
>> /tmp/myjob.log 2>&1을 붙입니다. cron은 출력을 crontab 소유자에게 메일로 보내므로(MAILTO), 메일 환경이 없으면 에러를 볼 수 없습니다. - 환경 확인:
* * * * * env > /tmp/cronenv 2>&1을 1분만 걸고 결과를 봅니다. cron은 SHELL·HOME·LOGNAME을 자동 설정하고 PATH는 환경에서 상속하므로 로그인 셸과 값이 다를 수 있습니다. 명령은 절대 경로로 쓰세요. - 로그 확인: cron은 syslog의
cron파실리티로 기록합니다.grep CRON /var/log/syslog또는journalctl -t CRON으로 봅니다./etc/default/cron에서 실행 옵션에-L 15를 더하면 시작·종료·실패·PID까지 남습니다. - 파일 형식: crontab은 마지막 줄이 개행으로 끝나야 설치됩니다. 명령·환경 변수와 같은 줄에 주석을 달 수 없고, 환경 변수는 아래 줄에만 적용됩니다.
- /etc/cron.d 규칙: root 소유에 그룹·타인 쓰기 권한이 없어야 합니다. 이름은 영문·숫자·밑줄·하이픈만 허용되며 점이 든 파일은 조용히 무시됩니다.
/etc/crontab의 환경 변수도 상속하지 않습니다. - 사용 권한:
/etc/cron.allow가 있으면 그 목록에 있어야 하고,/etc/cron.deny만 있으면 그 목록에 없어야 합니다. 둘 다 있으면cron.allow가 우선합니다.
주의사항
- Ubuntu 기본 cron은 사용자별 타임존을 지원하지 않습니다.
TZ는 실행되는 명령에만 영향을 주고 실행 시각은 시스템 타임존을 따릅니다. - 스풀(
/var/spool/cron/crontabs) 파일을 직접 편집하지 말고crontab명령으로 다루세요. - 계정 이름이 바뀌면 그 계정의 cron 작업은 실행되지 않습니다.
- 시스템 기본 작업은 이른 아침에 돌므로 그때 PC가 꺼져 있으면 시간 단위 작업 외에는 실행되지 않습니다. anacron이 설치돼 있으면 놓친 일·주·월 작업을 뒤늦게 대신 실행합니다.
- GUI 프로그램은
DISPLAY환경 변수를 직접 지정해야 돕니다.
그래도 안 될 때 추가 점검
- 스크립트 문제:
bash /경로/스크립트.sh를 터미널에서 직접 실행합니다. 여기서 실패하면 cron 문제가 아닙니다. - 실행 권한:
/etc/cron.hourly·daily·weekly·monthly파일은 실행 권한이 필요하지만/etc/cron.d파일은 설정 파일이라 필요 없습니다. - 요일·일 중복: 날짜와 요일을 둘 다 지정하면 하나만 맞아도 실행됩니다. 의도보다 자주 도는 원인입니다.
- 명령 길이: 명령 필드는 최대 998자입니다.
자주 묻는 질문
Q1. crontab을 고쳤는데 cron을 재시작해야 하나요?
아니요. cron은 매분 스풀과 /etc/crontab의 수정 시각을 확인해 바뀐 파일을 다시 읽습니다.
Q2. 로그가 /var/log/syslog에 없습니다.
설정에 따라 syslog 파일이 없을 수 있습니다. journalctl -t CRON으로 확인하고, 그래도 부족하면 출력을 파일로 리다이렉션해 직접 남기세요.
Q3. CRON_TZ를 쓰면 되지 않나요?CRON_TZ는 cronie 계열 기능입니다. Ubuntu 기본 cron 문서는 "사용자별 타임존을 지원하지 않는다"고 명시하므로, 시스템 시각으로 걸고 스크립트 안에서 시간을 판별하는 편이 안전합니다.
함께 보면 좋은 글
- 리눅스 리다이렉션·파이프 사용법: >, >>, |, 2>&1, tee 정리
- 리눅스 파일 권한·소유자 오류 해결: chmod·chown·umask
- 리눅스 명령어 정리 ② 프로세스·시스템 모니터링: ps·top·systemctl·journalctl
댓글