서버 운영
서버 재부팅 후 cron 작업이 제대로 도는지 확인하기
재부팅 후 자동 작업들이 실제로 실행되는지 확인하는 건 생각보다 까다롭다. 체계적으로 확인하는 방법.
서버를 재부팅하면 자동 실행 설정이 제대로 작동하는지 확인해야 한다. 특히 cron 작업, 서비스 시작, 데이터베이스 연결 등이 정말 동작하는지 알아야 운영이 편하다.
재부팅 후 확인 체크리스트
시스템 상태부터 확인
# 1. 서버가 정상으로 부팅되었는가
uname -a
uptime
# 2. 디스크/메모리는 충분한가
df -h
free -h
# 3. 네트워크 연결은 정상인가
ip link show
ip route
ping 8.8.8.8
포트와 서비스 확인
# 4. 필요한 포트가 열려 있는가
sudo ss -lntp | grep -E '80|443|3000|5432'
# 5. 주요 서비스가 실행 중인가
sudo systemctl status docker
sudo systemctl status postgresql
sudo systemctl status nginx
# 6. 서비스가 자동 시작으로 설정되었는가
sudo systemctl is-enabled postgresql
sudo systemctl is-enabled docker
Cron 작업 확인
Cron이 실제로 도는지 확인하는 가장 확실한 방법은 로그를 보는 것이다.
# Cron 데몬 로그 확인
sudo journalctl -u cron -n 50
# 또는
sudo grep CRON /var/log/syslog
# 특정 크론 작업 로그 찾기
sudo journalctl -u cron | grep "your-job-name"
Cron 작업이 있는데 로그가 없다면, 몇 가지 가능성이 있다.
- 작업 시간이 아직 지나지 않음 - 매일 2시에 실행되는데 지금 1시 59분이라면 당연히 아직 안 돈 것
- 권한 문제 - cron 작업이 필요한 권한이 없을 수 있음
- 환경 변수 누락 - cron은 제한된 환경에서 실행되므로, PATH나 기타 변수가 필요할 수 있음
Cron 작업 수동 테스트
Cron이 실제로 작동하는지 확인하려면, crontab에 정의된 명령을 직접 실행해보자.
# 현재 사용자의 crontab 확인
crontab -l
# root의 crontab 확인
sudo crontab -l
# 예: 매일 2시에 backup.sh를 실행한다면
/bin/bash /home/user/backup.sh
# 수동 실행 후 결과 확인
echo $?
# 0이면 성공, 0이 아니면 실패
Cron 환경 변수 문제 해결
Cron은 쉘과 다른 환경에서 실행되므로, PATH나 다른 변수가 누락될 수 있다. 이를 해결하는 방법:
# Crontab에 명시적으로 PATH 설정
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
SHELL=/bin/bash
# 작업
0 2 * * * /full/path/to/backup.sh >> /var/log/backup.log 2>&1
절대 경로를 사용하고, 로그를 명시적으로 리다이렉트하면 나중에 디버깅이 훨씬 쉽다.
Systemd Timer로 더 안전하게
Cron보다 Systemd timer를 쓰면 관리가 더 체계적이다. 재부팅 후에도 더 확실하게 작동한다.
# Timer 목록 확인
sudo systemctl list-timers --all
# 특정 timer의 다음 실행 시간 확인
sudo systemctl status my-task.timer
# Timer 실행 로그
sudo journalctl -u my-task.timer -n 20
sudo journalctl -u my-task.service -n 20
Systemd를 쓰면 권한, 환경 변수, 의존성 등을 명확히 정의할 수 있다.
재부팅 직후의 실시간 모니터링
배포 후 재부팅할 때는 처음 몇 분간 실시간으로 로그를 모니터링하는 게 좋다.
# 실시간 시스템 로그
sudo journalctl -f
# 또는 이전 부팅 로그와 비교
sudo journalctl -b -1 # 이전 부팅
sudo journalctl -b 0 # 현재 부팅
# 에러 메시지만 필터링
sudo journalctl -p err -n 50
자동화 스크립트 만들기
재부팅할 때마다 같은 확인을 반복하는 건 비효율적이다. 체크리스트를 스크립트로 만들면 편하다.
#!/bin/bash
echo "=== System Status ==="
uname -a
uptime
echo "\n=== Port Status ==="
sudo ss -lntp | grep LISTEN
echo "\n=== Service Status ==="
for service in docker postgresql nginx; do
echo "$service: $(sudo systemctl is-active $service)"
done
echo "\n=== Recent Cron Logs ==="
sudo journalctl -u cron -n 10
이 스크립트를 /usr/local/bin/post-reboot-check.sh에 저장해두고, 재부팅 후 언제든 실행하면 된다.
정리
서버 재부팅은 간단해 보이지만, 이후 모든 자동화가 제대로 작동하는지 확인하는 건 중요하다. 처음엔 수동으로 확인하고, 나중에 체계적으로 스크립트화하자. 특히 프로덕션 환경이라면 재부팅 직후의 모니터링을 빼먹지 말자. 몇 분의 확인이 나중의 고장을 예방한다.