DaleSchool

프로세스 관리

입문20분

학습 목표

  • ps, top으로 실행 중인 프로세스를 확인할 수 있다
  • kill로 프로세스를 종료할 수 있다
  • 백그라운드/포그라운드 실행을 전환할 수 있다
  • df, du로 디스크 사용량을 확인할 수 있다

동작하는 코드

예제 1: 실행 중인 프로세스 확인

ps

출력 예시:

  PID TTY           TIME CMD
 1234 ttys001    0:00.05 -zsh
 5678 ttys001    0:00.01 ps

각 컬럼의 의미:

  • PID: Process ID (프로세스 고유 번호)
  • TTY: 터미널 연결 정보
  • TIME: 사용한 CPU 시간
  • CMD: 실행 중인 명령어

더 많은 정보 보기:

ps aux

출력 예시:

USER       PID  %CPU %MEM      VSZ    RSS   TT  STAT STARTED      TIME COMMAND
dale      1234   0.0  0.1  408952   2056 s001  S   10:00am   0:00.05 -zsh
dale      5678   0.0  0.0  408400    896 s001  R+  10:05am   0:00.01 ps aux

추가 컬럼:

  • %CPU: CPU 사용률
  • %MEM: 메모리 사용률
  • STAT: 프로세스 상태 (S=절전, R=실행 중, Z=좀비)

예제 2: 특정 프로세스 찾기

ps aux | grep node

출력:

dale      3456   0.2  1.5 123456  30000 s001  S   09:00am   0:02.10 node server.js

예제 3: 포트를 점유한 프로세스 찾기

# 포트 3000을 사용하는 프로세스
lsof -i :3000

출력:

COMMAND   PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
node     3456 dale   23u  IPv6   0x...     0t0  TCP *:3000 (LISTEN)

PID를 확인하고 종료:

kill 3456

직접 수정하기

백그라운드 실행

# 뒤에 &를 붙이면 백그라운드에서 실행
sleep 30 &

출력:

[1] 7890

[1]은 작업 번호, 7890은 PID입니다.

# 백그라운드 작업 목록 확인
jobs

출력:

[1]  + running    sleep 30
# 백그라운드 작업을 포그라운드로 가져오기
fg %1

# 포그라운드 작업을 일시 중지 (Ctrl+Z)
# 그 후 백그라운드에서 계속 실행
bg %1

프로세스 종료

# 정상 종료 요청 (SIGTERM, 기본값)
kill 7890

# 강제 즉시 종료 (SIGKILL, 응답 없을 때)
kill -9 7890

# 작업 번호로 종료
kill %1

디스크 사용량 확인

# 전체 디스크 사용량 (읽기 좋은 단위)
df -h

출력:

Filesystem     Size   Used  Avail Capacity  Mounted on
/dev/disk1s1  500G   120G   375G    25%    /
/dev/disk1s2  500G   120G   375G    25%    /System/Volumes/Data
# 특정 디렉토리 크기
du -sh ~/Documents

출력:

2.1G    /Users/dale/Documents
# 하위 디렉토리별 크기 (상위 5개)
du -sh ~/Documents/* | sort -rh | head -5

출력:

1.5G    /Users/dale/Documents/Videos
342M    /Users/dale/Documents/Projects
 89M    /Users/dale/Documents/Archive
 12M    /Users/dale/Documents/Docs
4.0K    /Users/dale/Documents/notes.txt

"왜?" — 프로세스 관리가 필요한 상황

| 상황 | 해결책 | | -------------------------- | ----------------------------------------- | -------------------------------- | | 개발 서버가 응답 없음 | ps aux | grep node→ PID 확인 →kill PID | | 포트 3000이 이미 사용 중 | lsof -i :3000 → PID 확인 → kill PID | | 빌드/다운로드 중 다른 작업 | 명령어 & 로 백그라운드 실행 | | 디스크 공간 부족 | df -h로 상태, du -sh *로 큰 폴더 찾기 |

kill 시그널 정리

| 시그널 | 번호 | 의미 | 사용 시점 | | --------- | ---- | ----------------- | ----------------- | | SIGTERM | 15 | 정상 종료 요청 | 기본값, 먼저 시도 | | SIGKILL | 9 | 강제 즉시 종료 | 응답 없을 때 | | SIGINT | 2 | 인터럽트 (Ctrl+C) | 포그라운드 종료 | | SIGHUP | 1 | 재시작 | 설정 재로드 |

항상 kill (SIGTERM)을 먼저 시도하고, 응답이 없을 때만 kill -9를 쓰세요. SIGKILL은 프로세스가 정리할 기회를 주지 않습니다.

흔한 실수

실수 1: kill -9 먼저 사용

# 나쁜 습관
kill -9 1234   # 프로세스가 임시 파일, 소켓 등을 정리 못 할 수 있음

# 좋은 습관
kill 1234      # 먼저 정상 종료 시도
# 응답 없으면 그때 -9
kill -9 1234

실수 2: PID 확인 없이 kill

# 위험: 잘못된 PID를 종료할 수 있음
kill 1

# 안전: 먼저 확인
ps aux | grep node
# ... PID 확인 후 ...
kill 1234

실수 3: 백그라운드 작업 놓치기

터미널을 닫으면 백그라운드 작업도 종료됩니다. 터미널을 닫아도 계속 실행하려면:

# nohup: 터미널 종료 후에도 계속 실행
nohup python server.py &

# 출력은 nohup.out 파일에 저장
tail -f nohup.out

심화 학습

top과 htop으로 실시간 모니터링

top은 프로세스 목록을 실시간으로 보여줍니다:

top

조작법:

  • q — 종료
  • k — 프로세스 종료 (PID 입력)
  • u — 특정 사용자 필터
  • M — 메모리 사용량 정렬

htop은 더 편리한 대안입니다:

brew install htop
htop

htop 특징:

  • 색상으로 CPU/메모리 시각화
  • 마우스로 프로세스 클릭
  • 화살표로 이동, F9로 kill
프로세스 상태 코드 읽기

ps aux의 STAT 컬럼:

| 코드 | 상태 | | ---- | ------------------------------------- | | R | Running (실행 중) | | S | Sleeping (대기 중) | | D | Disk wait (I/O 대기) | | Z | Zombie (종료됐지만 부모가 수거 안 함) | | T | Stopped (Ctrl+Z로 일시 정지) | | + | 포그라운드 프로세스 | | s | 세션 리더 |

좀비 프로세스(Z)는 직접 kill이 안 됩니다. 부모 프로세스를 종료하면 함께 정리됩니다.

  1. ps aux | grep bash로 현재 실행 중인 bash/zsh 프로세스를 확인하세요.
  2. sleep 30 &으로 백그라운드 작업을 시작하고, jobs로 확인하세요.
  3. fg %1로 포그라운드로 가져온 후, Ctrl+C로 종료하세요.
  4. df -h로 디스크 사용량을 확인하고 여유 공간이 얼마나 있는지 확인하세요.
  5. du -sh ~로 홈 디렉토리의 전체 크기를 확인하세요.

Q1. 프로세스를 강제로 즉시 종료하는 kill 시그널은?

  • A) kill -1
  • B) kill -9
  • C) kill -15
  • D) kill -2