우분투 실전 명령어 | crontab 정기 작업 등록과 로그 검증

서버에서 반복 작업(백업, 로그 정리, 상태 체크)을 수동으로 돌리다 보면 빠뜨리는 날이 꼭 생깁니다. 이럴 때 cron으로 실행 주기를 고정해두면 운영이 훨씬 안정됩니다. 다만 환경변수, 작업 경로, 로그 처리까지 같이 설계해야 나중에 문제를 빨리 잡을 수 있습니다.

바로 쓰는 명령어

# 현재 사용자 crontab 확인
crontab -l

# 편집기 열기
crontab -e
# 매일 03:10에 백업 스크립트 실행 + 로그 파일 누적
10 3 * * * /usr/local/bin/backup-db.sh >> /var/log/backup-db.log 2>&1

# 5분마다 디스크 사용량 기록
*/5 * * * * /bin/df -h >> /var/log/disk-usage.log 2>&1
# 시스템 전체 cron 로그 확인
sudo journalctl -u cron -n 100 --no-pager

# 작업 로그 실시간 확인
tail -f /var/log/backup-db.log

핵심 옵션/패턴

  • crontab -e: 현재 사용자 기준 스케줄 편집
  • crontab -l: 등록된 항목 조회
  • MAILTO="": cron 메일 비활성화(메일 설정 안 쓸 때)
  • 절대경로 사용: cron은 PATH가 좁아서 python, bash 같은 명령이 실패할 수 있습니다.
  • 실행 위치 고정: 필요한 경우 cd /path && ./script.sh 형태로 작업 디렉터리를 명시하세요.
# 예: 작업 디렉터리 고정 + 스크립트 실행
0 * * * * cd /opt/myjob && /usr/bin/bash run.sh >> /var/log/myjob.log 2>&1

자주 하는 실수

  • 쉘에서 되던 명령을 cron에 그대로 넣고 PATH 문제로 실패
  • 로그 리다이렉션(>> ... 2>&1) 없이 등록해서 실패 원인을 못 찾음
  • * * * * *를 테스트용으로 넣어두고 제거를 까먹어 과도 실행
  • 상대경로(./script.sh)를 사용해서 cron 환경에서 파일을 못 찾는 문제

검증 방법

# crontab 파싱 결과 확인
crontab -l | sed -n '1,120p'

# cron 서비스 상태 확인
systemctl status cron --no-pager
# 최근 30분 cron 실행 로그 필터
sudo journalctl -u cron --since "30 min ago" --no-pager

# 작업이 실제로 파일을 남기는지 확인
ls -lh /var/log/backup-db.log /var/log/disk-usage.log

운영 팁

실서비스에서는 작업마다 로그 파일을 분리하고, logrotate와 같이 묶어서 관리하는 게 좋습니다. 또 백업/정리 작업은 시작 전에 잠금 파일(flock)을 걸어 중복 실행을 막아두면 장애 가능성을 크게 줄일 수 있습니다.

출처

Ubuntu Server Guide
crontab man page
systemd journalctl man page