본문 바로가기
IT

[리눅스 기초 #18] 터미널을 꺼도 내 프로세스는 죽지 않아: nohup과 disown으로 생존 본능 깨우기

by sunyjiny 2026. 1. 30.
반응형

리눅스 기초 시리즈의 18번째 시간에 오신 것을 환영합니다! 지난 시간에는 터미널 하나에서 여러 작업을 넘나드는 bg와 fg를 배웠습니다. 하지만 여기에는 치명적인 약점이 하나 있습니다. 바로 **'터미널(세션)을 종료하면 배경에서 돌던 작업들도 함께 죽는다'**는 사실입니다.

퇴근하면서 노트북을 덮거나, 갑자기 Wi-Fi가 끊겨 SSH 접속이 종료되었을 때, 80%쯤 진행되던 AI 모델 학습이나 대용량 백업 작업이 증발해버린 경험이 있으신가요? 오늘은 터미널이라는 부모의 품을 떠나 독립적으로 살아남는 프로세스를 만드는 법, **nohup**과 **disown**에 대해 알아보겠습니다.


1. 나의 경험담: "연결 끊김이 가져온 대참사"

최근 제 블로그(sunyjini.com)에 올릴 데이터를 수집하기 위해 파이썬 크롤러를 돌려놓고 퇴근했습니다. &를 붙여서 배경 작업으로 돌려놨으니 당연히 잘 돌아가고 있을 줄 알았죠. 그런데 다음 날 아침 확인해 보니 데이터는 반도 수집되지 않았고 프로세스는 흔적도 없이 사라져 있었습니다.

알고 보니 제가 터미널 창을 닫는 순간, 리눅스 커널이 해당 세션에 속한 모든 자식 프로세스에게 **SIGHUP(Hangup)**이라는 "부모가 퇴근하니 너희도 그만 자라"는 신호를 보냈던 것입니다. 이 '친절한 학살'로부터 내 프로세스를 구출하는 법을 미리 알았더라면 밤새 잠을 설칠 일은 없었을 텐데 말이죠.


2. nohup: "끊지 마(No Hang Up)!"

**nohup**은 이름 그대로 SIGHUP 신호를 무시(Ignore)하도록 설정하고 명령어를 실행하는 도구입니다. 이 명령어로 실행된 프로세스는 터미널이 닫혀도 갈 길을 갑니다.

실험 코드: nohup으로 무적 프로세스 만들기

Bash
 
# 1. nohup으로 파이스크립트 실행 (배경 실행 &와 함께 쓰는 것이 정석입니다)
nohup python3 long_running_script.py &

# 2. 실행 결과 확인
# nohup: ignoring input and appending output to 'nohup.out'

nohup을 사용하면 기본적으로 화면에 출력될 내용들이 **nohup.out**이라는 파일에 자동으로 저장됩니다. 나중에 터미널을 다시 켜서 작업이 잘 끝났는지 이 파일을 열어보면 되죠.

(▲ Action: cat nohup.out을 입력하면 내가 자는 동안 프로세스가 어떤 일을 했는지 로그를 확인할 수 있습니다.)


3. disown: "이미 시작했다면? 소유권을 포기하라"

그런데 만약 nohup을 붙이는 걸 깜빡하고 이미 작업을 시작해 버렸다면 어떻게 할까요? 이때 구원투수로 등판하는 것이 **disown**입니다. 현재 쉘이 관리하는 작업 목록(Jobs)에서 해당 프로세스를 제거하여, 쉘이 죽어도 영향을 받지 않게 '독립'시키는 명령어입니다.

실험 코드: 뒤늦게 생존권 부여하기

Bash
 
# 1. 이미 실행 중인 작업을 Ctrl+Z로 멈추고 bg로 배경으로 보냅니다.
# (지난 시간 복습!)
bg %1

# 2. disown 명령어로 쉘과의 인연을 끊어줍니다.
disown %1

# 3. 이제 터미널을 닫아도 이 작업은 죽지 않습니다.

4. & vs nohup vs screen/tmux: 무엇을 써야 할까?

리눅스에는 작업을 유지하는 여러 방법이 있어 헷갈리기 쉽습니다. 2026년 현재 가장 많이 쓰이는 기준을 정리해 드립니다.

방법 특징 추천 상황
명령어 & 단순히 배경에서 실행함 터미널을 켜둔 채로 다른 일을 할 때
nohup 명령어 & SIGHUP 신호를 무시함 로그아웃 후에도 작업이 유지되어야 할 때
disown 실행 중인 작업을 쉘에서 분리 nohup을 깜빡하고 실행했을 때
tmux / screen 세션 자체를 가상으로 유지 가장 강력함, 작업 중 다시 접속해서 화면을 봐야 할 때

5. After: 진정한 서버 관리자의 길

이제 여러분은 물리적인 환경(Wi-Fi 연결, 터미널 종료)에 구애받지 않고 프로세스를 조종할 수 있게 되었습니다. nohup과 disown은 특히 클라우드 서버나 원격 서버를 다룰 때 **'심리적 안정감'**을 주는 아주 고마운 도구입니다.

오늘의 인사이트: "부모(Terminal)가 죽어도 자식(Process)은 살아야 한다. 그것이 리눅스 생태계의 비정한 매력이자 효율성이다."


6. 마치며: 기초 시리즈의 완성도가 높아지고 있습니다

18번째 주제까지 오면서 우리는 이제 프로세스의 탄생부터 죽음, 그리고 불멸(nohup)까지 다룰 수 있게 되었습니다. 리눅스라는 운영체제가 얼마나 유연하고 강력한지 조금씩 체감이 되시나요?

오늘의 포스팅이 여러분의 '밤샘 작업'을 지켜주는 든든한 방패가 되었나요? 혹시 nohup.out 파일 용량이 너무 커져서 곤란했던 경험은 없으신가요? (그럴 땐 nohup 명령어 > /dev/null 2>&1 &라는 마법의 구문을 쓰면 됩니다!)

다음 시간에는 터미널 안에서 아예 '새로운 가상 세계'를 만들어 세션을 완벽하게 보존하는 tmux의 기초에 대해 다뤄볼까요? 원하신다면 tmux 설치부터 화면 분할 꿀팁까지 정리해 드릴 수 있습니다.

반응형