Linux 백그라운드 프로세스 실행 완벽 가이드 nohup disown 차이와 실전 활용법

SSH로 원격 서버에 접속해 작업을 실행했는데, 터미널을 닫는 순간 프로세스가 종료된 경험이 있습니까? 장시간 실행되는 배치 작업이나 서버 프로세스를 안전하게 백그라운드에서 유지하려면, 단순히 & 기호만으로는 부족합니다. 이 글에서는 nohup, &, disown의 동작 원리와 실전 활용법을 명확히 정리합니다.


SSH 종료 후에도 프로세스 살리기 nohup disown 활용 가이드




1. 백그라운드 실행의 기본: & 기호

명령어 끝에 & 기호를 추가하면 해당 프로세스가 백그라운드에서 실행됩니다.

  • 사용법: $ command &
  • 출력: 셸은 작업 ID(Job ID, 대괄호로 표시)와 프로세스 ID(PID)를 반환합니다.
  • 제약사항: 터미널 세션에 종속되어 있어, 터미널을 닫으면 해당 프로세스도 함께 종료됩니다.

핵심 원리: 터미널이 종료되면 해당 세션에 연결된 모든 프로세스에 SIGHUP(hangup) 시그널이 전송됩니다. 기본 동작은 프로세스 종료이므로, 백그라운드 실행만으로는 터미널 독립성을 보장할 수 없습니다.

2. 터미널 종료에도 살아남는 방법: nohup

nohup은 "no hang up"의 약자로, SIGHUP 시그널을 무시하도록 프로세스를 실행합니다.

  • 사용법: $ nohup command &
  • 출력 리다이렉션: 표준 출력과 에러는 자동으로 nohup.out 파일에 저장됩니다.
  • 권장 패턴: $ nohup python batch.py > output.log 2>&1 &

실전 팁:

  1. 로그 파일 경로를 명시적으로 지정하지 않으면 현재 디렉터리에 nohup.out이 생성되므로, 권한 문제나 디스크 용량을 사전에 확인하십시오.
  2. 표준 에러(stderr)도 함께 리다이렉션하려면 2>&1을 반드시 추가하십시오.
  3. nohup은 프로세스 시작 시점에만 적용 가능합니다. 이미 실행 중인 프로세스에는 적용할 수 없습니다.

3. 실행 중인 프로세스 보호: disown

이미 백그라운드로 실행 중인 작업을 터미널 세션에서 분리하려면 disown을 사용합니다.

  • 사용법:
    1. 프로세스를 백그라운드로 실행: $ command &
    2. 작업 리스트 확인: $ jobs
    3. 특정 작업 분리: $ disown %1 (또는 전체 분리: $ disown)
  • 동작 원리: 셸의 작업 테이블에서 해당 프로세스를 제거하여, 터미널 종료 시 SIGHUP 전송 대상에서 제외합니다.

nohup vs disown 선택 기준:

  • nohup: 프로세스 시작 전에 적용. 로그 리다이렉션이 자동화되어 있어 배치 작업에 적합합니다.
  • disown: 이미 실행 중인 프로세스를 사후에 보호. 급하게 터미널을 닫아야 할 때 유용하지만, 표준 출력이 터미널에 연결되어 있으면 에러가 발생할 수 있습니다.

4. 프로덕션 환경에서의 권장 패턴

실무에서는 단순 백그라운드 실행보다 프로세스 관리 도구를 사용하는 것을 권장합니다.

  • systemd: 서비스 단위로 프로세스를 관리하며, 자동 재시작, 로그 집중화, 리소스 제한 기능을 제공합니다.
  • supervisord: Python 기반 프로세스 관리 도구로, 설정이 직관적이며 웹 UI를 지원합니다.
  • tmux / screen: 터미널 멀티플렉서를 사용하면 세션 자체를 유지할 수 있어, 재접속 후 작업 상태를 그대로 확인할 수 있습니다.

주의사항: nohup과 disown은 간단한 테스트나 일회성 작업에는 유용하지만, 프로세스 모니터링, 자동 재시작, 로그 로테이션이 필요한 프로덕션 환경에서는 systemd나 supervisord 같은 전용 도구를 사용하십시오.

요약 및 Action Item

백그라운드 실행(&)만으로는 터미널 종료 시 프로세스가 함께 종료됩니다. nohup은 프로세스 시작 시 SIGHUP을 차단하며, disown은 실행 중인 프로세스를 사후에 보호합니다. 프로덕션 환경에서는 systemd나 supervisord를 사용하여 프로세스 생명주기를 체계적으로 관리하는 것이 안정성과 운영 효율성을 모두 확보할 수 있습니다.

당장 실행할 것: 현재 실행 중인 장시간 배치 작업이 있다면, jobs 명령으로 작업 ID를 확인한 뒤 disown %작업번호를 실행하여 터미널 종료로부터 보호하십시오. 향후 반복 작업은 nohup과 로그 리다이렉션을 조합한 스크립트로 자동화하는 것을 권장합니다.


#함께 읽으면 좋은 글

Linux 파일 권한의 모든 것: chmod 755 vs 777 차이와 chown 사용법 : 바로보기

댓글