리눅스 기초 시리즈의 18번째 시간에 오신 것을 환영합니다! 지난 시간에는 터미널 하나에서 여러 작업을 넘나드는 bg와 fg를 배웠습니다. 하지만 여기에는 치명적인 약점이 하나 있습니다. 바로 **'터미널(세션)을 종료하면 배경에서 돌던 작업들도 함께 죽는다'**는 사실입니다.
퇴근하면서 노트북을 덮거나, 갑자기 Wi-Fi가 끊겨 SSH 접속이 종료되었을 때, 80%쯤 진행되던 AI 모델 학습이나 대용량 백업 작업이 증발해버린 경험이 있으신가요? 오늘은 터미널이라는 부모의 품을 떠나 독립적으로 살아남는 프로세스를 만드는 법, **nohup**과 **disown**에 대해 알아보겠습니다.
1. 나의 경험담: "연결 끊김이 가져온 대참사"
최근 제 블로그(sunyjini.com)에 올릴 데이터를 수집하기 위해 파이썬 크롤러를 돌려놓고 퇴근했습니다. &를 붙여서 배경 작업으로 돌려놨으니 당연히 잘 돌아가고 있을 줄 알았죠. 그런데 다음 날 아침 확인해 보니 데이터는 반도 수집되지 않았고 프로세스는 흔적도 없이 사라져 있었습니다.
알고 보니 제가 터미널 창을 닫는 순간, 리눅스 커널이 해당 세션에 속한 모든 자식 프로세스에게 **SIGHUP(Hangup)**이라는 "부모가 퇴근하니 너희도 그만 자라"는 신호를 보냈던 것입니다. 이 '친절한 학살'로부터 내 프로세스를 구출하는 법을 미리 알았더라면 밤새 잠을 설칠 일은 없었을 텐데 말이죠.
2. nohup: "끊지 마(No Hang Up)!"
**nohup**은 이름 그대로 SIGHUP 신호를 무시(Ignore)하도록 설정하고 명령어를 실행하는 도구입니다. 이 명령어로 실행된 프로세스는 터미널이 닫혀도 갈 길을 갑니다.
실험 코드: nohup으로 무적 프로세스 만들기
# 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)에서 해당 프로세스를 제거하여, 쉘이 죽어도 영향을 받지 않게 '독립'시키는 명령어입니다.
실험 코드: 뒤늦게 생존권 부여하기
# 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 설치부터 화면 분할 꿀팁까지 정리해 드릴 수 있습니다.
'IT' 카테고리의 다른 글
| [리눅스 기초 #20] 코딩은 '눈맛'이다: 윈도우 폰트로 터미널 가독성 200% 올리기 (0) | 2026.01.31 |
|---|---|
| [리눅스 기초 #19] 터미널에서 윈도우 탐색기를 소환하는 마법:explorer.exe . (0) | 2026.01.31 |
| [리눅스 기초 #17] 터미널은 하나인데 몸이 두 개였으면? bg, fg로 작업 제어 마스터하기 (0) | 2026.01.30 |
| [리눅스 기초 #16] "응답 없는 너를 보내며" : top과 kill로 폭주하는 프로세스 진압하기 (0) | 2026.01.30 |
| [리눅스 기초 #15] "너는 누구냐?" : uname과 hostname으로 시스템 정체성 확인하기 (1) | 2026.01.29 |