실무에서 AI 관련 프로젝트를 진행하다보니, 리소스 관리가 특히나 중요해졌습니다.
퇴근 후에는 서버를 사용하지 않는데, 켜져있으면 낭비가 발생하죠. 그래서 퇴근 직전에 매일 서버를 직접 꺼야 했었는데요.
하루종일 바쁘게 보내다 맞이한 퇴근의 기쁨에 서버 끄는 것을 잊어버리는 사태가 가끔 발생하더라구요.
그래서, 차라리 이걸 자동화해버리고, 다른 업무에 집중하자! 라는 생각이 들었습니다.
그렇게 시도해본
GPU 서버 자동 종료 시스템 구축하기
두둥탁
1️⃣ 시스템 구성 개요
우리가 만들 시스템은 다음과 같은 특징을 가집니다.
- 매일 저녁 19시에 자동으로 서버 종료
- 특정 날짜는 제외일로 지정 가능 (야간 작업이 필요한 경우 등)
- 모든 동작을 로그로 기록
- 재부팅 후에도 설정 유지
2️⃣ 시스템 구현 렛츠고
1단계: 제외일 관리 파일 생성
먼저 종료를 건너뛸 날짜를 관리할 파일을 만듭니다.
sudo nano /home/ubuntu/excluded_days.txt
파일 내용은 간단히 날짜를 나열합니다.


필요할 때마다 날짜를 추가하거나 삭제할 수 있습니다.
# 오늘을 제외일로 추가
echo $(date +%F) | sudo tee -a /home/ubuntu/excluded_days.txt
# 특정 날짜 추가
echo "2025-11-15" | sudo tee -a /home/ubuntu/excluded_days.txt
2단계: 자동 종료 스크립트 작성
이제 핵심 로직을 담은 스크립트를 작성합니다.
sudo nano /home/ubuntu/shutdown-cron.sh

#!/bin/bash
# 로그 파일 경로
LOG_FILE="/var/log/auto-shutdown.log"
# 오늘 날짜
TODAY=$(date +%F)
# 로그 기록 함수
log_message() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG_FILE"
}
# 제외일 확인 (주석을 무시하도록 조건 추가)
if grep -v "^#" /home/ubuntu/excluded_days.txt | grep -v "^$" | grep -q "^$TODAY$"; then
log_message "제외일이므로 종료를 건너뜁니다."
exit 0
fi
# 종료 실행
log_message "자동 종료를 시작합니다."
shutdown -h now
스크립트 동작 원리
이 스크립트는 다음 순서로 동작합니다.
- 오늘 날짜를 YYYY-MM-DD 형식으로 가져옵니다
- excluded_days.txt 파일에서 오늘 날짜를 찾습니다
- 오늘이 제외일이면 로그만 남기고 종료합니다
- 제외일이 아니면 서버를 종료합니다
✨ 참고할 점
- shutdown 명령어 옵션을 `-k` 로 주면, 실제 셧다운은 일어나지 않고 셧다운을 하듯 로그만 볼 수 있음!
- 즉, 테스트용으로는 -k, 운영용으로는 -h를 사용하면 됨!
- grep -q "^$TODAY$" 부분의 `^` 와 `$`는 정확히 일치하는 줄만 찾도록 하는 정규표현식!
- 이렇게 하면, 2025-10-20 과 2025-10-2 가 잘못 매칭되는 것을 방지할 수 있음!
3단계: 실행 권한 부여
스크립트가 실행될 수 있도록 권한을 설정합니다.
sudo chmod +x /home/ubuntu/shutdown-cron.sh
4단계: Cron 작업 등록
이제 매일 19시에 스크립트가 실행되도록 cron에 등록합니다.
sudo crontab -e
처음 실행하면 편집기를 선택하라는 메시지가 나옵니다. nano를 선택하는 것을 추천합니다.
다음 줄을 추가합니다.
# 매일 19시에 종료 스크립트 실행
0 19 * * * /home/ubuntu/shutdown-cron.sh
참고) Cron 문법 이해하기

예를 들어 평일에만 실행하고 싶다면 이렇게 수정할 수 있습니다.
0 19 * * 1-5 /home/ubuntu/shutdown-cron.sh
5단계: 설정 확인
모든 설정이 제대로 되었는지 확인합니다.
# Cron 작업 목록 확인
sudo crontab -l
# Cron 서비스 상태 확인
sudo systemctl status cron
로그 모니터링
시스템이 어떻게 동작하는지 로그를 통해 확인할 수 있습니다.
# 로그 전체 보기
sudo cat /var/log/auto-shutdown.log
# 실시간 로그 모니터링
sudo tail -f /var/log/auto-shutdown.log

짜잔 정상적일 경우 로그가 이런식으로 뜹니당! (테스트용으로 실행)
3️⃣ 추가 사항
Q : 서버를 껐다 켜면 cron 설정이 사라지지 않을까?
A : NOPE! cron 설정은 `/var/spool/cron/` 디렉토리에 파일로 저장되기 때문에, 재부팅해도 유지됨. 한번만 설정하면 계속 작동!
Q : 추가 개선할 수 있는 아이디어는?
A : 종료 전 알림 기능, slack webhook 연동을 통한 알림 연동