백그라운드 데몬 crond가 1분마다 깨어나 모든 사용자의 예약 목록을 확인하고, 실행 시각이 된 작업을 실행한다.
예약 목록을 담는 파일·테이블을 crontab(cron table)이라 부른다.
사용자별 crontab을 관리하는 명령이 crontab이다.
명령
동작
crontab -e
내 crontab 편집(없으면 새로 생성)
crontab -l
내 crontab 목록 출력
crontab -r
내 crontab 전체 삭제
crontab -u user -e
특정 사용자의 crontab 편집(root)
crontab -e # 편집기로 내 예약 작업 추가/수정crontab -l # 현재 등록된 예약 작업 보기crontab -r # 모든 예약 작업 삭제(주의!)crontab -u alice -l # alice의 예약 작업 보기(root 권한)
⚠️ 함정: crontab -r은 확인 없이 전체를 삭제한다. 편집하려던 -e를 키보드에서 한 칸 옆 -r로 잘못 누르면 모든 예약이 날아간다. 실무에서는 crontab -l > backup.txt로 백업 후 작업하는 습관이 권장된다. -l(목록)·-e(편집)·-r(삭제)을 명확히 구분해야 한다.
# 분 시 일 월 요일 명령 0 3 * * * /backup.sh # 매일 새벽 3시 0분 30 2 * * 1 /weekly.sh # 매주 월요일 새벽 2시 30분 0 */6 * * * /check.sh # 6시간마다(0,6,12,18시) */10 * * * * /poll.sh # 10분마다 0 0 1 * * /monthly.sh # 매월 1일 자정 0 9 * * 1-5 /workday.sh # 평일(월~금) 오전 9시 15 14 1 * * /report.sh # 매월 1일 14시 15분
5필드 순서는 "분-시-일-월-요일"이며 시간 단위가 작은 것부터 큰 것 순이다(요일만 예외로 맨 뒤). 요일은 0=일요일에서 시작해 6=토요일이고, 7도 일요일로 인정된다. 24시간제이므로 오후 2시는 14다. 이 순서를 "분시일월요"로 외운다.
⚠️ 함정: 일(3번째)과 요일(5번째)을 둘 다 지정하면 OR로 동작한다 — 둘 중 하나라도 맞으면 실행된다. 예를 들어 0 0 13 * 5는 "매월 13일 또는 매주 금요일"마다 실행되지(둘 다 만족하는 13일의 금요일만이 아님), AND가 아니다. 이 OR 동작은 함정이 되기 쉽다.
직접 쳐보기: crontab -e로 */2 * * * * date >> ~/crontest.log 한 줄을 넣고 저장한다. 2분마다 현재 시각이 파일에 쌓인다. 몇 분 뒤 cat ~/crontest.log로 누적을 확인하고, 다 봤으면 crontab -e에서 그 줄을 지운다. 5필드가 실제로 어떻게 도는지 눈으로 본다.
사용자 crontab(crontab -e)과 별개로 시스템 전역 예약을 두는 곳이 있다 — /etc/crontab 파일과 /etc/cron.d/ 디렉터리.
결정적 차이는 사용자(user) 필드가 하나 더 있다는 점이다.
이유: 사용자 crontab은 등록자 권한으로 돌지만, 시스템 crontab은 어느 사용자 권한으로 실행할지 명시해야 하기 때문.
# /etc/crontab 형식 (필드 6개 = 5시간필드 + 사용자 + 명령)
# 분 시 일 월 요일 사용자 명령
0 4 * * * root /usr/local/bin/cleanup.sh
위치
사용자 crontab
시스템 crontab(/etc/crontab)
만드는 법
crontab -e
파일 직접 편집
필드 수
5필드 + 명령
5필드 + 사용자 + 명령
실행 권한
등록한 사용자
지정한 사용자 필드
저장 위치
/var/spool/cron/사용자명
/etc/crontab, /etc/cron.d/*
정해진 주기별 디렉터리도 있다. 시각을 적지 않고 스크립트를 넣어두기만 하면 자동 실행된다.
디렉터리
실행 주기
/etc/cron.hourly/
매시간
/etc/cron.daily/
매일
/etc/cron.weekly/
매주
/etc/cron.monthly/
매월
사용자 crontab은 5필드, 시스템 crontab(/etc/crontab·cron.d)은 6필드(사용자 추가)라는 차이가 핵심 출제 포인트다. /etc/cron.d/는 패키지가 자기 예약을 추가하기 좋은 곳으로, /etc/crontab과 같은 6필드 형식을 쓴다. cron.daily 같은 디렉터리는 시각을 적지 않고 스크립트만 넣는다(실행 시각은 anacron/시스템이 관리).
cron은 그리스어 'chronos'(시간)에서 왔다. 1970년대 유닉스부터 있었고, 노트북처럼 항상 켜져 있지 않은 시스템을 위해 anacron이 추가되었다 — cron은 정확히 그 시각에 꺼져 있으면 작업을 건너뛰지만, anacron은 "마지막 실행 후 N일 지났으면 켜진 직후에라도 실행"한다. cron.daily 등이 anacron과 연동되는 이유다.
cron이 "반복"이라면 at은 "딱 한 번"이다. 지정한 시각에 명령을 한 번 실행하고 큐에서 사라진다.
at 17:00 # 오후 5시에 실행할 명령 입력 모드at> /usr/local/bin/report.shat> <Ctrl+D로 입력 종료>at now + 2 hours # 지금부터 2시간 뒤at 10:30 tomorrow # 내일 오전 10시 30분at midnight # 오늘 자정echo "/backup.sh" | at 3am # 파이프로 명령 전달
at 작업을 관리하는 명령이 따로 있다.
명령
동작
at 시각
그 시각에 실행할 작업 등록
atq (또는 at -l)
대기 중인 at 작업 목록
atrm 번호 (또는 at -d)
대기 작업 삭제
batch는 at의 변형이다. 시각을 지정하지 않고 시스템 부하(load average)가 낮아지면(보통 0.8 미만) 자동 실행한다.
용도: CPU가 한가할 때 무거운 작업을 돌리고 싶을 때.
batch # 시스템이 한가해지면 실행at> /heavy-compute.shat> <Ctrl+D>
구분
cron
at
batch
실행 횟수
반복
1회
1회
실행 시점
정해진 주기
지정 시각
부하 낮을 때
데몬
crond
atd
atd
등록
crontab -e
at 시각
batch
cron은 반복, at/batch는 1회성이다. "매일 새벽 백업"은 cron, "내일 한 번만 점검"은 at이다. at은 입력을 Ctrl+D(EOF)로 끝내며, 등록 목록은 atq, 삭제는 atrm이다(at -l/at -d도 동일). batch는 시각이 아니라 부하를 기준으로 실행한다는 점이 at과의 차이다.
직접 쳐보기: echo "echo hello > ~/at-test.txt" | at now + 1 minute을 실행하고 atq로 대기 목록을 확인한다. 1분 뒤 cat ~/at-test.txt에 hello가 적혀 있으면 성공이고, atq에서는 작업이 사라진다(1회성 확인). 취소하려면 atq로 번호를 보고 atrm 번호.