손 안 가는 서버 — cron으로 굴러가는 작은 자동화들
셀프호스팅 구축기 14편(마지막). 백업도(12편) 동기화도(13편) 결국 “정해진 시각에 알아서” 돌아야 한다. 그 엔진이 cron이다.
요약
- cron(크론)은 정해진 시각에 명령을 돌리는 리눅스 기본 스케줄러 — 따로 설치할 것 없다
- 우리 서버가 매일 알아서 하는 일: 백업 · DB 덤프 · 캐시 정리 · 헬스체크 · 요약 생성
crontab한 줄 = 분·시·일·월·요일 + 실행할 명령- 함정 1: cron엔 PATH가 거의 없다 → 절대경로 안 쓰면 “command not found”
- 함정 2: 조용한 실패 — 로그로 안 남기면, 안 돈 걸 며칠 뒤에야 안다
1. cron이 뭔가 — 설치 없는 알람시계
cron은 리눅스에 기본으로 들어 있는 알람시계다. “매일 새벽 4시 반에 이 스크립트 실행”처럼 시각과 명령을 등록해 두면, 컴퓨터가 켜져 있는 한 알아서 돌린다. 셀프호스팅에서 반복되는 잡일은 거의 다 cron에 맡길 수 있다.
2. crontab 한 줄 읽는 법
등록 목록을 crontab이라 부른다. 한 줄은 다섯 칸의 시각 + 명령으로 이루어진다.
| 칸 | 의미 | 범위 |
|---|---|---|
| 1 | 분 | 0–59 |
| 2 | 시 | 0–23 |
| 3 | 일 | 1–31 |
| 4 | 월 | 1–12 |
| 5 | 요일 | 0–6 (0=일) |
*는 “매번”이라는 뜻이다. 그래서 30 4 * * *는 매일 4시 30분이 된다.
30 4 * * * /home/user/bin/db-dump.sh >> /var/log/db-dump.log 2>&1
0 5 * * * /home/user/bin/backup.sh >> /var/log/backup.log 2>&1
3. 우리 서버가 매일 하는 일
작은 cron들이 쌓여 “손 안 가는 서버”를 만든다.
- DB 덤프 — 데이터베이스를 안전한 파일로 (백업보다 먼저)
- 파일 백업 — NAS로 전송 (12편)
- 캐시 정리 — 쌓인 임시 파일·만료 캐시 비우기
- 헬스체크 — 서비스가 살아 있는지 확인, 죽었으면 알림
- 요약 생성 — 어제 방문자·에러 한 장으로 정리
4. 초보가 꼭 밟는 함정 3개
① PATH가 없다. 터미널에서 잘 되던 명령이 cron에선 “command not found”로 죽는다. cron은 최소한의 환경에서 돌아 PATH가 거의 비어 있기 때문이다. 해결: 명령을 절대경로로 쓰거나(/usr/bin/python3), 스크립트 맨 위에 PATH를 직접 지정한다.
② 조용한 실패. cron은 에러가 나도 화면에 안 띄운다. 기본적으로 메일로만 보내는데 아무도 안 본다. 그래서 위 예시처럼 >> 로그파일 2>&1로 출력과 에러를 파일에 남겨야, 안 돌았을 때 추적이 된다.
③ 시간대. 서버 시계가 UTC인지 한국 시간(KST)인지 확인하자. 30 4 * * *로 “새벽 4시 반”을 노렸는데 서버가 UTC면 한국 시각으로는 오후 1시 반에 돈다.
5. 작은 자동화의 복리
cron 하나하나는 사소하다. 백업 한 줄, 캐시 정리 한 줄. 그런데 이게 쌓이면 내가 매일 손대지 않아도 서버가 스스로를 돌보는 상태가 된다. 셀프호스팅의 목표는 결국 이거다 — 만들어 놓고, 잊어버려도 굴러가는 것.
이 시리즈도 여기서 한 바퀴를 돈다. 빈 컴퓨터 한 대에서 시작해(1편), 블로그를 올리고, 도메인을 붙이고, 막고, 백업하고, 이제 자동으로 굴러가게 했다. 다음은 직접 한 대 세워 보는 일만 남았다.
한 줄 정리
cron은 “정해진 시각에 알아서”의 엔진이다. 한 줄에 분·시·일·월·요일 + 명령. 단 세 가지만 조심하자 — 절대경로로 쓰고, 로그를 남기고, 시간대를 확인할 것. 작은 자동화가 쌓이면 서버는 손이 안 가게 된다.

답글 남기기