우분투 실전 명령어 | nohup, jobs, disown 백그라운드 실행 관리

언제 쓰는가

긴 배치 작업이나 로그 수집을 SSH 세션에서 시작했는데, 터미널을 닫아도 작업이 계속 돌아가야 할 때 쓴다.
야간 작업을 걸어두고 중간에 접속이 끊길 수 있는 환경에서도 nohup, jobs, disown 조합이 실전에서 자주 필요하다.

바로 쓰는 명령어

# 세션이 끊겨도 계속 실행되게 백그라운드로 시작
nohup bash -c 'python3 /opt/batch/nightly_report.py' > /var/log/nightly_report.log 2>&1 &

# 실행 후 PID 확인
echo $!
# 이미 실행 중인 포그라운드 작업을 백그라운드로 전환
# 1) 실행 중 Ctrl+Z
# 2) bg %1
# 3) disown %1

# 현재 셸의 백그라운드 작업 목록 확인
jobs -l

핵심 옵션/패턴

  • nohup은 SIGHUP 신호를 무시하게 해서 터미널 종료 후에도 프로세스가 살아남게 한다.
  • > 파일 2>&1을 붙여 표준 출력과 에러를 한 파일로 모아야 장애 원인을 추적하기 쉽다.
  • &를 붙이면 즉시 백그라운드로 보내고, echo $!로 PID를 바로 기록할 수 있다.
  • 이미 올라간 작업은 Ctrl+Zbg로 백그라운드 전환, 마지막에 disown으로 셸과 연결을 끊는 패턴이 안전하다.

명령 출력 예시

$ nohup bash -c 'python3 /opt/batch/nightly_report.py' > /var/log/nightly_report.log 2>&1 &
[1] 48291
$ echo $!
48291
$ jobs -l
[1]+ 48291 Running                 nohup bash -c python3 /opt/batch/nightly_report.py > /var/log/nightly_report.log 2>&1 &
$ disown %1
$ jobs -l

자주 하는 실수

  • 로그 리다이렉션 없이 nohup만 실행한다. 기본 nohup.out에 쌓여서 위치를 놓치기 쉽다.
  • disown을 빼먹는다. 셸 종료 시 잡 제어 상태 때문에 기대와 다르게 정리되는 경우가 있다.
  • 한 번에 여러 작업을 띄우고 PID 기록을 안 남긴다. 나중에 어떤 프로세스가 배치인지 식별이 어려워진다.
  • 백그라운드 실행만 믿고 상태 점검을 안 한다. 시작 직후 실패해도 모른 채 넘어가기 쉽다.

검증 방법

# 프로세스 존재 확인
ps -fp 48291

# 명령행 기준으로 재확인
pgrep -af nightly_report.py
# 로그가 실제로 갱신되는지 확인
tail -n 50 /var/log/nightly_report.log

# 프로세스 종료 코드 확인이 필요하면 wait 사용
wait 48291; echo $?

운영 팁

장시간 작업은 nohup보다 tmuxsystemd-run이 더 운영 친화적일 때가 많다.
다만 단발성 작업은 nohup + 로그 파일 + PID 기록만 지켜도 장애 대응 속도가 크게 올라간다.

출처

  • GNU Coreutils Manual
  • Bash Reference Manual
  • Ubuntu Server Guide