리눅스에서 crontab으로 서비스 자동 재시작 설정하는 방법 (실무 예제 포함)
운영 서버에서 간헐적으로 죽는 프로세스, 갑자기 중단되는 백그라운드 작업, 잘 안 살아나는 Node.js 앱... 이런 경우, 서버 담당자는 꼭 묻습니다.
“죽으면 자동으로 다시 올라오게 못 하나요?”
물론 가능합니다. 가장 간단한 방법이 바로 리눅스 crontab을 활용한 자동 재시작 구성입니다.
이번 글에서는 crontab을 이용해 리눅스 서버에서 특정 서비스나 스크립트를 정기적으로 모니터링하고, 꺼져 있으면 자동으로 재시작하는 방식을 단계별로 안내합니다. 실무에서 바로 쓸 수 있는 명령어와 스크립트 예제도 함께 드립니다.
1. crontab이란?
crontab은 리눅스의 대표적인 스케줄러입니다. 특정 시간마다 명령어를 실행하도록 설정할 수 있고, 시스템 관리 자동화에서 거의 필수로 사용됩니다.
명령어:
crontab -e # 사용자별 크론 편집
crontab -l # 등록된 크론 목록 확인
2. 자동 재시작이 필요한 상황
- 서비스가 간헐적으로 죽는 경우 (예: spring boot, nginx, node)
- 스크립트가 백그라운드에서 돌고 있어야 하는 경우 (예: python 작업)
- 갑작스러운 메모리 부족으로 죽었을 때 자동 복구
3. 서비스 상태 확인 및 재시작 쉘 스크립트 만들기
예시로 nginx 서비스를 감시한다고 가정해 보겠습니다.
#!/bin/bash
SERVICE_NAME="nginx"
if ! systemctl is-active --quiet $SERVICE_NAME; then
echo "$(date) - $SERVICE_NAME not running. restarting..." >> /var/log/restart.log
systemctl restart $SERVICE_NAME
fi
이 스크립트를 예를 들어 /usr/local/bin/check_nginx.sh 로 저장하고 실행 권한을 부여합니다.
chmod +x /usr/local/bin/check_nginx.sh
4. crontab에 등록하기 (매 5분마다 감시)
crontab -e
편집기에서 아래 내용을 추가합니다:
*/5 * * * * /usr/local/bin/check_nginx.sh
이렇게 하면 5분마다 nginx가 실행 중인지 확인하고, 꺼져 있으면 자동으로 다시 실행됩니다.
🔒 Tip. 로그 관리까지 하고 싶다면?
*/5 * * * * /usr/local/bin/check_nginx.sh >> /var/log/check_nginx.log 2>&1
표준 출력과 에러 출력을 모두 로그로 남길 수 있습니다.
5. systemctl 서비스 대신 단독 스크립트 실행 감시
예: Node.js 앱을 직접 node app.js로 실행했다면 PID를 추적하기 어렵습니다. 이런 경우 pgrep 명령을 활용하면 됩니다.
#!/bin/bash
APP_NAME="app.js"
PROCESS=$(pgrep -f $APP_NAME)
if [ -z "$PROCESS" ]; then
echo "$(date) - $APP_NAME not running. restarting..." >> /var/log/restart.log
nohup node /home/ubuntu/app/app.js &
fi
6. crontab 등록 상태 확인 및 제거
등록된 모든 크론 목록 보기:
crontab -l
모든 크론 삭제:
crontab -r
특정 크론만 지우고 싶다면 crontab -e로 편집하여 해당 줄만 삭제하면 됩니다.
7. 주의사항
- 스크립트에 절대경로를 사용하세요. (crontab은 $PATH가 제한적)
- 로그 남기기를 습관화하세요. 원인 분석에 도움이 됩니다.
- crontab은 매초 단위 실행이 불가합니다. 최소 단위는 1분입니다.
- root 사용자로 crontab을 설정할 경우 더 넓은 권한으로 서비스 재시작이 가능하지만, 주의해서 다뤄야 합니다.
마무리
간단하지만 강력한 crontab은 서버 운영의 버팀목이 됩니다.
서버에서 서비스가 죽었을 때 자동으로 살아나도록 구성해두면 예기치 못한 장애에 대응할 수 있고, 매번 수동으로 확인하고 조치할 필요도 없어집니다.
이번 포스팅에서 제공한 스크립트는 그대로 실무에 적용 가능한 수준이니 꼭 테스트 서버에 먼저 적용해보고 운영에 반영해 보시기 바랍니다.
'웹개발 > 서버 운영 & 인프라' 카테고리의 다른 글
| 웹 서버 포트 충돌 해결법 총정리: 리눅스에서 실무적으로 처리하는 방법 (3) | 2025.08.03 |
|---|---|
| Nginx와 Apache 차이점 총정리: 어떤 웹서버를 써야 할까? (1) | 2025.08.02 |
| AWS EC2에 WAR 파일 배포, 실무에서는 이렇게 합니다 (Tomcat 환경 기준) (1) | 2025.07.19 |
| Sticky Session 없이 Tomcat 세션 공유? 실무에서 직접 설정한 방법 정리 (4) | 2025.07.19 |
| Apache + Tomcat 로드밸런싱 구성 방법 (mod_jk vs mod_proxy 실무 설정 예제) (0) | 2025.06.26 |