SSH 끊어도 프로세스 유지하기 – nohup과 백그라운드 실행 완전 가이드

1. SSH 연결을 끊으면 실행 중이던 앱도 종료된다

처음 서버에서 앱을 실행할 때 이런 경험을 합니다. python3 app.py를 실행하고 SSH 세션을 닫으면, 앱도 함께 종료됩니다. 다음 날 서버에 접속해 보면 앱이 꺼져 있습니다.

이것은 버그가 아니라 리눅스의 정상 동작입니다. SSH 세션이 종료되면 해당 세션에서 시작된 모든 프로세스에 종료 신호가 전달됩니다.

서버에서 앱을 24시간 동안 지속적으로 실행하려면 이 동작을 우회해야 합니다.

2. SIGHUP이란 무엇인가?

SSH 세션이 종료될 때 시스템은 해당 세션의 모든 자식 프로세스에게 SIGHUP(Signal Hangup) 신호를 보냅니다. 원래 전화 모뎀이 연결을 끊을 때(hangup) 전달하던 신호에서 유래했습니다.

대부분의 프로세스는 SIGHUP을 받으면 기본적으로 종료됩니다. nohup의 역할은 바로 이 SIGHUP 신호를 **무시(no hangup)**하도록 프로세스를 실행하는 것입니다.

3. 백그라운드 실행 – & 기호 사용법

명령어 끝에 &를 붙이면 백그라운드에서 실행됩니다. 터미널이 바로 반환되어 다른 작업을 계속할 수 있습니다.

python3 app.py &

실행하면 PID(프로세스 ID)가 출력되고 터미널 프롬프트가 바로 나타납니다.

하지만 &만으로는 SSH 세션을 닫으면 프로세스도 함께 종료됩니다. SIGHUP을 막지 못하기 때문입니다.

4. nohup 명령어 완전 이해

nohup은 프로세스가 SIGHUP 신호를 무시하도록 설정하는 명령어입니다. 앞에 붙여서 사용합니다.

nohup python3 app.py

이 명령어를 실행하면 두 가지 일이 일어납니다. SIGHUP 신호가 전달돼도 프로세스가 계속 실행됩니다. 표준 출력이 자동으로 현재 디렉토리의 nohup.out 파일에 저장됩니다.

하지만 이 상태는 아직 포그라운드 실행입니다. 터미널이 여전히 해당 프로세스에 묶여 있습니다.

5. nohup과 &를 조합하는 방법

nohup과 &를 함께 사용하면 SSH가 끊겨도 프로세스가 유지되고, 터미널도 즉시 반환됩니다.

nohup python3 app.py &

실행 후 PID가 출력되고 프롬프트가 돌아옵니다. SSH 세션을 닫아도 프로세스는 계속 동작합니다.

출력 로그를 별도 파일에 저장하고 싶다면 리다이렉션을 추가합니다. 2>&1은 표준 오류(stderr)도 함께 파일에 기록한다는 의미입니다.

nohup python3 app.py > /var/log/myapp.log 2>&1 &

6. 실행 중인 백그라운드 프로세스 관리

프로세스 목록 확인 현재 실행 중인 프로세스를 확인합니다.

ps aux | grep python3

프로세스 종료 PID를 확인하고 kill 명령으로 종료합니다.

kill 프로세스PID

응답이 없을 때 강제 종료합니다.

kill -9 프로세스PID

현재 터미널의 백그라운드 작업 확인 jobs 명령으로 현재 세션의 백그라운드 작업 목록을 봅니다.

백그라운드 작업을 포그라운드로 가져오기 fg %작업번호 명령으로 백그라운드 작업을 포그라운드로 전환할 수 있습니다.

7. Node.js라면 PM2를 쓰는 게 훨씬 낫다

Node.js 앱을 운영한다면 nohup보다 **PM2(Process Manager 2)**를 사용하는 것이 훨씬 효율적입니다.

PM2는 프로세스 매니저로 nohup이 제공하지 못하는 기능을 제공합니다. 앱이 오류로 종료되면 자동으로 재시작합니다. 로그를 파일로 관리하고 pm2 logs 명령으로 쉽게 확인할 수 있습니다. 서버 재부팅 후 자동 시작 설정이 가능합니다. 클러스터 모드로 여러 CPU 코어를 활용할 수 있습니다.

PM2 전역 설치입니다.

npm install -g pm2

앱 시작입니다.

pm2 start app.js –name myapp

서버 재부팅 후 자동 시작 등록입니다.

pm2 startup pm2 save

실행 중인 앱 목록 확인입니다.

pm2 list

8. 정리 및 다음 단계

오늘 배운 핵심을 정리합니다.

  • SSH 세션이 종료되면 SIGHUP 신호가 전달되어 프로세스도 함께 종료됩니다.
  • &는 백그라운드 실행이지만 SSH 종료 시 함께 종료됩니다.
  • nohup은 SIGHUP 신호를 무시해 SSH 종료 후에도 프로세스를 유지합니다.
  • 실전에서는 nohup 명령어 & 형태로 둘을 조합해 사용합니다.
  • Node.js 앱이라면 자동 재시작, 로그 관리까지 지원하는 PM2 사용을 권장합니다.

다음 글에서는 rsync와 cron을 활용해 서버 백업을 완전 자동화하는 방법을 알아보겠습니다.

댓글 남기기

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.