동작하는 코드
예제 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이 안 됩니다. 부모 프로세스를 종료하면 함께 정리됩니다.
ps aux | grep bash로 현재 실행 중인 bash/zsh 프로세스를 확인하세요.sleep 30 &으로 백그라운드 작업을 시작하고,jobs로 확인하세요.fg %1로 포그라운드로 가져온 후, Ctrl+C로 종료하세요.df -h로 디스크 사용량을 확인하고 여유 공간이 얼마나 있는지 확인하세요.du -sh ~로 홈 디렉토리의 전체 크기를 확인하세요.
Q1. 프로세스를 강제로 즉시 종료하는 kill 시그널은?
- A)
kill -1 - B)
kill -9 - C)
kill -15 - D)
kill -2