# 1. 리눅스에서 “프로세스와 터미널”의 관계 터미널에서 실행한 프로그램은 기본적으로: ``` [사용자 터미널] → [Shell] → [프로세스] ``` 이 구조입니다. 그리고 터미널을 닫으면: ``` 터미널 종료 → SIGHUP (Hangup signal) 발생 → 하위 프로세스 죽음 ``` 그래서 서버에서 그냥 실행하면, 로그아웃 순간 다 꺼지는 겁니다. --- # 2. nohup (No Hang Up)의 본질 ### ✅ 역할 > 터미널이 죽어도 **프로세스에 SIGHUP을 보내지 않게** 만드는 명령 ### ✅ 내부 동작 `nohup`은 프로그램을 실행할 때: - SIGHUP 시그널을 무시하도록 설정 - stdout / stderr를 자동으로 `nohup.out`으로 리다이렉트 ### ✅ 구조 ```bash nohup python script.py ``` 실제로는 내부적으로: ```c signal(SIGHUP, SIG_IGN) exec(python script.py) ``` 와 거의 동일한 상태가 됩니다. --- # 3. bg (Background)의 본질 ### ✅ 역할 > **중지된 잡(job)** 을 다시 백그라운드에서 실행 ### ✅ 사용 흐름 ```bash Ctrl + Z # 일시정지 (SIGSTOP) bg # 백그라운드에서 재시작 ``` ### ✅ 상태 변화 |상태|의미| |---|---| |Stopped|Ctrl+Z 됨| |Running|fg/bg 됨| |Background|& 또는 bg| --- # 4. disown (Shell과 인연 끊기기) ### ✅ 역할 > 쉘이 해당 프로세스를 **“내 자식으로 관리하지 않도록” 제거** 즉: - shell 종료 - logout - session 종료 해도 해당 프로세스는 영향 안 받음 ### ✅ 사용 ```bash disown ``` or 특정 프로세스: ```bash disown %1 ``` --- # 5. 세 명령의 차이 요약 |명령|역할| |---|---| |nohup|SIGHUP 차단| |bg|중지된 프로세스를 백그라운드로| |disown|Shell 관리 대상에서 제거| --- # 6. 실전 패턴 BEST 5 --- ## ✅ 패턴 1. 가장 추천 (운영용) ```bash nohup command > log.txt 2>&1 & ``` ✔ SIGHUP 무시 ✔ 백그라운드 실행 ✔ 로그 기록 ✔ 쉘 종료 영향 없음 --- ## ✅ 패턴 2. 실행 중인 작업 살리기 ```bash Ctrl + Z bg disown ``` ✔ 지금 프로세스를 유지시키고 퇴장 --- ## ✅ 패턴 3. 이미 실행한 프로세스를 nohup처럼 만들기 ```bash disown -h %1 ``` → 해당 job에 SIGHUP 면역 --- ## ✅ 패턴 4. 백그라운드 로그 실시간 감시 ```bash tail -f nohup.out ``` --- ## ✅ 패턴 5. 터미널별로 잡 관리 ```bash jobs ``` --- # 7. 사람들이 자주 헷갈리는 함정 --- ## ❌ nohup만 쓰면 자동 백그라운드 아니다 ```bash nohup cmd ``` → 포어그라운드 실행됨 ✅ 진짜 백그라운드: ```bash nohup cmd & ``` --- ## ❌ bg는 새 프로그램 실행 아님 ```bash bg python app.py ❌ ``` bg는 이미 있는 job만 대상으로 합니다. --- ## ❌ disown 안 하면 터미널 닫을 때 죽을 수 있음 `nohup` 없는 `bg` 상태는: > 세션 종료 시 죽을 수 있음 --- ## ❌ Ctrl+C는 언제나 kill `nohup`이 있어도 포어그라운드 상태면 Ctrl+C 누르면 죽습니다. --- # 8. 눈에 보이게 한 줄 요약 ```bash nohup + & → 백그라운드 + 로그 + 안전 Ctrl+Z + bg → 살려서 보내기 disown → 쉘과 완전 결별 ``` --- # 9. 언제 무엇을 쓰면 되나? |상황|추천| |---|---| |처음부터 오래 돌릴 작업|`nohup cmd &`| |이미 실행 중인 작업 유지|`Ctrl+Z → bg → disown`| |로그만 남기고 돌리기|`nohup cmd > log.txt &`| |서버 관리급 자동화|`systemd`|