# 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`|