1. 매일 똑같은 작업을 사람이 직접 해야 할까?
서버를 운영하다 보면 반복되는 작업이 생깁니다. 매일 새벽 3시에 데이터베이스를 백업하거나, 매주 월요일마다 오래된 로그 파일을 정리하거나, 매시간마다 특정 스크립트를 실행하는 식입니다.
이 모든 것을 알람을 맞추고 직접 실행하는 건 현실적으로 불가능합니다. 한 번만 설정해두면 알아서 실행해주는 도구가 있으면 좋겠죠. 리눅스에는 바로 그런 도구가 있습니다. 바로 cron입니다.
2. cron이란 무엇인가?
cron은 리눅스에서 지정한 시간에 명령어나 스크립트를 자동으로 실행하는 스케줄링 도구입니다. 서버가 켜져 있는 한 설정한 시간이 되면 어김없이 실행됩니다.
cron 작업 목록은 **crontab(cron table)**이라는 파일에 저장됩니다. 각 사용자마다 별도의 crontab 파일을 가질 수 있습니다.
일반적인 사무실 스케줄러 앱을 생각해보면 이해하기 쉽습니다. “매주 월요일 오전 9시에 회의 알림 보내기”처럼 언제, 무엇을 할지 등록해두면 자동으로 처리됩니다. cron도 정확히 같은 방식으로 동작합니다.
3. crontab 문법 파헤치기
crontab 파일의 각 줄은 다음 형식을 따릅니다.
분 시 일 월 요일 실행명령어
5개의 시간 필드와 실행할 명령어로 구성됩니다. 각 필드의 의미와 허용 범위입니다.
| 필드 | 범위 | 예시 |
|---|---|---|
| 분 | 0~59 | 30 (30분) |
| 시 | 0~23 | 14 (오후 2시) |
| 일 | 1~31 | 15 (15일) |
| 월 | 1~12 | 6 (6월) |
| 요일 | 0~7 | 1 (월요일, 0과 7 모두 일요일) |
특수 문자 활용
별표(*)는 모든 값을 의미합니다. 시 필드에 *를 쓰면 매시간을 뜻합니다.
슬래시(/)는 간격을 의미합니다. */10은 10마다를 뜻합니다. 분 필드에 */10을 쓰면 10분마다 실행합니다.
쉼표(,)는 여러 값을 나열합니다. 1,15,30은 1분, 15분, 30분에 각각 실행합니다.
하이픈(-)은 범위를 표현합니다. 9-18은 9부터 18까지를 의미합니다.
실전 예시로 이해하기
매일 오전 2시 30분에 실행하는 경우입니다. 30 2 * * * 명령어
월~금 오전 9시에만 실행하는 경우입니다. 0 9 * * 1-5 명령어
15분마다 실행하는 경우입니다. */15 * * * * 명령어
매월 1일 자정에 실행하는 경우입니다. 0 0 1 * * 명령어
crontab.guru 사이트에서 cron 표현식을 입력하면 언제 실행되는지 시각적으로 확인할 수 있습니다.
4. crontab 등록하고 관리하는 방법
현재 사용자의 crontab 파일을 편집합니다.
crontab -e
처음 실행 시 편집기를 선택하는 화면이 나옵니다. 초보자에게는 nano(번호 1)를 선택하는 것을 권장합니다.
편집기가 열리면 각 줄에 cron 작업을 추가하고 저장합니다. nano에서는 Ctrl + X → Y → Enter로 저장합니다.
등록된 cron 목록을 확인합니다.
crontab -l
모든 cron 작업을 삭제하고 싶을 때 사용합니다. 실행 즉시 모든 작업이 삭제되므로 신중하게 사용합니다.
crontab -r
5. 실전에서 바로 쓸 수 있는 cron 예시 모음
매일 새벽 3시에 웹 파일 백업
0 3 * * * rsync -av /var/www/html/ /backup/html_$(date +%Y%m%d)/
매주 일요일 자정에 오래된 로그 정리
0 0 * * 0 find /var/log -name “*.log” -mtime +30 -delete
5분마다 서버 상태 체크 스크립트 실행
*/5 * * * * /home/ubuntu/scripts/health_check.sh
매월 1일 오전 4시에 MySQL 백업
0 4 1 * * mysqldump -u root -p비밀번호 –all-databases > /backup/db_$(date +%Y%m%d).sql
서버 재부팅 후 자동으로 특정 앱 실행
@reboot /home/ubuntu/scripts/start_app.sh
@reboot는 서버가 재부팅될 때마다 해당 명령을 실행하는 특수 키워드입니다.
6. cron이 동작하지 않을 때 해결법
cron을 등록했는데 실행이 안 된다면 아래 순서로 확인합니다.
cron 서비스가 실행 중인지 확인합니다.
sudo systemctl status cron
active 상태가 아니라면 sudo systemctl start cron으로 시작합니다.
cron 실행 로그를 확인합니다.
grep CRON /var/log/syslog | tail -20
cron이 실행됐는지, 오류가 있는지 확인할 수 있습니다.
명령어 경로를 절대 경로로 작성합니다.
cron은 일반 터미널과 환경 변수가 다르기 때문에 python3 대신 /usr/bin/python3처럼 절대 경로를 사용해야 합니다.
스크립트 실행 권한을 확인합니다.
chmod +x /home/ubuntu/scripts/backup.sh
실행 권한이 없는 스크립트는 cron이 실행해도 아무 일도 일어나지 않습니다.
7. 정리 및 다음 단계
오늘 배운 핵심을 정리합니다.
- cron은 리눅스에서 정해진 시간에 명령어를 자동 실행하는 스케줄러입니다.
- crontab 형식은 분 시 일 월 요일 명령어 순서입니다.
crontab -e로 등록하고crontab -l로 목록을 확인합니다.- 명령어는 반드시 절대 경로로 작성하고, 스크립트에 실행 권한을 부여합니다.
- 실행 여부는
/var/log/syslog의 CRON 로그로 확인할 수 있습니다.
다음 글에서는 RAM이 부족한 저사양 서버에서 swap 메모리를 설정하는 방법을 알아보겠습니다.