← Blog
배포 & 인프라

Daemon으로 백그라운드 서버 실행하기

한 줄 요약

nohup으로 백그라운드 프로세스를 띄우면 SSH 세션이 끊겨도 서버가 계속 동작하며, 종료할 때는 쉘을 강제로 닫지 않고 exit로 정상 종료해야 한다.

왜 알아야 했나

  • 사내 서비스 배포 중 SvelteKit 서버를 백그라운드에서 띄워야 했음
  • 단순히 npm run preview만 실행하면 터미널 닫는 순간 서버도 함께 종료됨

핵심 개념

Daemon 명령어 모음

작업명령어
데몬 띄우기nohup npm run preview &
로그 보기tail -f nohup.out
서버 끄기 (포트로)fuser -k 8100/tcp

주의사항

쉘을 바로 끄면 안 됨

  • 터미널 창을 X 버튼으로 강제 종료하면 자식 프로세스에 SIGHUP이 전달될 수 있음
  • 반드시 exit 명령으로 쉘을 정상 종료한 후 창을 닫아야 함

각 명령어의 의미

nohup npm run preview &

  • nohup: "no hang up" — 터미널이 종료(hang up)되어도 프로세스 유지
  • &: 백그라운드로 실행 (터미널 즉시 반환)
  • 결과: 표준 출력이 자동으로 nohup.out 파일에 기록됨

tail -f nohup.out

  • nohup.out 파일의 끝부분을 실시간으로 따라가며 보여줌
  • -f = follow. 새 로그가 쌓이면 자동으로 화면에 추가됨
  • 종료: Ctrl+C (로그 보기만 중단, 서버는 계속 동작)

fuser -k 8100/tcp

  • 특정 포트(8100)를 점유하고 있는 프로세스를 강제 종료
  • -k = kill. 해당 포트의 프로세스에 SIGKILL 전송
  • PID를 모를 때 빠르게 정리하는 용도

예시 / 코드

# 1. 서버 백그라운드 실행
nohup npm run preview &

# 2. 잘 떴는지 로그 확인
tail -f nohup.out

# 3. 정상 작동 확인 후 Ctrl+C로 로그 보기 중단
# (서버는 계속 동작 중)

# 4. SSH 세션 종료할 때
exit

서버 끄고 다시 띄울 때:

fuser -k 8100/tcp   # 기존 서버 종료
nohup npm run preview &   # 다시 띄우기

헷갈렸던 점

  • & 하나만 붙여도 백그라운드는 되지만, 터미널이 닫히면 같이 죽음 → nohup이 꼭 필요
  • nohup.out 파일이 계속 쌓이면 용량 문제 생길 수 있음 (주기적 관리 필요)

실무 적용

  • 사내 서비스 SvelteKit 서버 배포 환경에서 사용 중
  • 단순 데모/테스트 서버 띄울 때 PM2 같은 무거운 도구 안 쓰고 빠르게 처리 가능
  • 단점: 프로세스 모니터링/자동 재시작 기능 없음 → 프로덕션 진지하게 운영하면 PM2systemd 고려

더 공부할 것

  • PM2로 더 안정적인 프로세스 관리 (자동 재시작, 로그 분할, 클러스터 모드)
  • systemd 서비스로 등록해서 OS 부팅 시 자동 실행
  • nohup.out 로그 로테이션 설정

🔗 참고