← 전체 글로 돌아가기

서버 운영

서버 재부팅 후 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 작업이 있는데 로그가 없다면, 몇 가지 가능성이 있다.

  1. 작업 시간이 아직 지나지 않음 - 매일 2시에 실행되는데 지금 1시 59분이라면 당연히 아직 안 돈 것
  2. 권한 문제 - cron 작업이 필요한 권한이 없을 수 있음
  3. 환경 변수 누락 - 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에 저장해두고, 재부팅 후 언제든 실행하면 된다.

정리

서버 재부팅은 간단해 보이지만, 이후 모든 자동화가 제대로 작동하는지 확인하는 건 중요하다. 처음엔 수동으로 확인하고, 나중에 체계적으로 스크립트화하자. 특히 프로덕션 환경이라면 재부팅 직후의 모니터링을 빼먹지 말자. 몇 분의 확인이 나중의 고장을 예방한다.