프로세스 확인 (ps, top, htop)
터미널에서 명령어 하나를 입력하는 순간 리눅스 커널은 새로운 프로세스를 만듭니다. 그 프로세스는 작업을 마치고 사라집니다. 하지만 시스템에는 항상 수십, 수백 개의 프로세스가 동시에 살아 움직입니다. 웹 서버, 데이터베이스, 로그 수집기, 그리고 방금 실행한 여러분의 스크립트까지.
스크립트를 작성할 때 특정 프로세스가 살아있는지 확인해야 하거나, 시스템 자원이 부족해지는 원인을 찾아야 할 때 이 절의 내용이 필요합니다.
프로세스란 무엇인가
프로세스는 실행 중인 프로그램의 인스턴스입니다. 프로그램 파일 자체는 디스크에 저장된 코드일 뿐이지만, 그것이 실행되면 메모리를 차지하고 CPU를 사용하는 프로세스가 됩니다.
모든 프로세스는 고유한 식별자를 갖습니다.
- PID(Process ID): 프로세스의 고유 번호. 시스템이 부팅될 때 1번 프로세스(systemd)부터 시작해 순차적으로 부여됩니다.
- PPID(Parent Process ID): 이 프로세스를 만든 부모 프로세스의 PID. 모든 프로세스는 부모가 있습니다.
쉘에서 명령어를 실행하면 쉘(부모)이 자식 프로세스를 만들어 명령어를 실행합니다. 이 관계가 쌓이면 프로세스 트리가 됩니다.
# 현재 쉘과 부모 프로세스 확인echo "현재 쉘 PID: $$"echo "부모 PID: $PPID"
실행 결과는 다음과 같습니다.
현재 쉘 PID: 12345
부모 PID: 12300
ps 명령어로 프로세스 보기
ps(process status)는 현재 실행 중인 프로세스의 스냅샷을 찍어줍니다. 옵션에 따라 보여주는 정보가 달라집니다.
# 기본: 현재 터미널에 연결된 프로세스만 표시ps# 시스템 전체 프로세스 (BSD 스타일, 가장 많이 쓰임)ps aux# 모든 프로세스, 전체 형식 (Unix 스타일)ps -ef# 프로세스 트리 형태로 출력ps --forest -e
ps aux를 실행하면 다음처럼 출력됩니다.
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168940 11756 ? Ss 09:00 0:02 /sbin/init
www-data 1234 0.3 2.1 456780 87234 ? S 09:01 1:15 /usr/sbin/nginx
student 5678 0.0 0.0 10340 3456 pts/0 R+ 10:30 0:00 ps aux
각 컬럼의 의미를 알아야 출력을 제대로 읽을 수 있습니다.
| 컬럼 | 의미 |
|---|---|
| USER | 프로세스를 실행한 사용자 |
| PID | 프로세스 ID |
| %CPU | CPU 사용률 |
| %MEM | 실제 메모리(RAM) 사용률 |
| VSZ | 가상 메모리 크기(KB). 요청한 전체 메모리 |
| RSS | 실제 사용 중인 물리 메모리(KB) |
| TTY | 연결된 터미널. ?는 터미널 없음(데몬) |
| STAT | 프로세스 상태 코드 |
| START | 프로세스 시작 시각 |
| TIME | 누적 CPU 사용 시간 |
| COMMAND | 실행 명령어 |
STAT 코드는 프로세스가 지금 무엇을 하고 있는지 알려줍니다.
| 코드 | 의미 | 설명 |
|---|---|---|
| R | Running | 현재 CPU에서 실행 중 또는 실행 대기 중 |
| S | Sleeping | 이벤트 대기 중 (인터럽트 가능) |
| D | Disk Sleep | I/O 대기 중 (인터럽트 불가) |
| Z | Zombie | 종료됐지만 부모가 아직 처리하지 않음 |
| T | Stopped | 시그널로 정지됨 (Ctrl+Z) |
| s | Session Leader | 세션 리더 프로세스 |
| + | Foreground | 포그라운드 프로세스 그룹 |
좀비 프로세스(Z)는 실제로는 종료됐지만 부모 프로세스가 wait() 시스템 콜로 종료 상태를 수거하지 않아 프로세스 테이블에 남아있는 상태입니다. 스크립트에서 자식 프로세스를 생성할 때 이 처리를 빠뜨리면 좀비가 쌓입니다.
원하는 프로세스 찾기
수백 개 프로세스 중에서 특정 프로세스를 찾을 때는 grep과 조합합니다.
# nginx 프로세스 찾기 (grep 자신 제외)ps aux | grep nginx | grep -v grep# 특정 사용자의 프로세스만 보기ps -u student# PID로 특정 프로세스 보기ps -p 1234# 이름으로 PID 찾기 (pgrep 사용)pgrep nginx
top으로 실시간 모니터링
ps는 순간의 스냅샷이지만 top은 실시간 화면입니다. 기본적으로 3초마다 갱신됩니다.
top
실행하면 다음과 같은 화면이 나타납니다.
top - 10:35:22 up 1:35, 2 users, load average: 0.12, 0.08, 0.05
Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.3 us, 0.7 sy, 0.0 ni, 96.7 id, 0.2 wa, 0.0 hi, 0.1 si
MiB Mem : 3934.0 total, 2341.2 free, 892.4 used, 700.4 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 2873.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 www-data 20 0 456780 87234 12340 S 0.7 2.2 1:15.34 nginx
5678 student 20 0 148920 45678 8234 R 0.3 1.1 0:02.45 python3
top 실행 중에 키보드 단축키로 동작을 바꿀 수 있습니다.
| 단축키 | 동작 |
|---|---|
| q | 종료 |
| k | 프로세스 종료 (PID 입력 → 시그널 입력) |
| M | 메모리 사용량 내림차순 정렬 |
| P | CPU 사용량 내림차순 정렬 (기본) |
| T | 누적 CPU 시간 내림차순 정렬 |
| u | 특정 사용자 프로세스만 표시 |
| 1 | CPU 코어별 사용률 표시/숨기기 |
| h | 도움말 |
상단의 load average는 1분, 5분, 15분 평균 부하를 나타냅니다. CPU 코어 수와 비교해 해석합니다. 4코어 시스템에서 load average가 4.0이면 CPU가 꽉 찬 상태입니다.
htop으로 더 편리하게
htop은 top의 개선판입니다. 색상과 그래픽 표시, 마우스 지원, 더 직관적인 인터페이스를 제공합니다. Ubuntu에는 기본 설치되지 않습니다.
# 설치sudo apt install htop# 실행htop
htop 화면 구성입니다.
CPU[||||||||||||||||||||||| 12.5%] Tasks: 142, 1 thr; 1 running
Mem[||||||||||||||||||| 892M/3.84G] Load average: 0.12 0.08 0.05
Swp[ 0K/2G] Uptime: 01:35:22
PID USER PRI NI VIRT RES SHR S CPU% MEM% TIME+ Command
1234 www-data 20 0 446M 85M 12M S 0.7 2.2 1:15.34 nginx
5678 student 20 0 145M 44M 8M R 0.3 1.1 0:02.45 python3
htop의 기능적 장점은 프로세스 트리 보기(F5), 검색(F3), 필터(F4), 정렬(F6) 등을 단축키로 쉽게 사용할 수 있다는 점입니다. 특히 마우스 클릭으로 컬럼 정렬을 바꿀 수 있어 실무에서 편리합니다.
실습: 현재 실행 중인 프로세스 분석
다음 스크립트로 시스템에서 CPU와 메모리를 가장 많이 사용하는 프로세스를 리포트합니다.
#!/usr/bin/env bash# 파일: process_report.shset -euo pipefailecho "===== 프로세스 현황 리포트 ====="echo "시각: $(date)"echo ""echo "--- CPU 사용량 상위 5개 ---"ps aux --sort=-%cpu | head -6 | awk 'NR==1{print} NR>1{printf "%-10s %5s %5s %s\n", $1, $3, $4, $11}'echo ""echo "--- 메모리 사용량 상위 5개 ---"ps aux --sort=-%mem | head -6 | awk 'NR==1{print} NR>1{printf "%-10s %5s %5s %s\n", $1, $3, $4, $11}'echo ""echo "--- 프로세스 상태 요약 ---"ps aux | awk 'NR>1{print $8}' | sort | uniq -c | sort -rn | \ awk '{printf " %s: %d개\n", $2, $1}'echo ""echo "--- 시스템 부하 ---"uptime
실행하면 다음과 같은 결과가 나옵니다.
===== 프로세스 현황 리포트 =====
시각: Thu Apr 24 10:35:22 KST 2026
--- CPU 사용량 상위 5개 ---
USER %CPU %MEM COMMAND
student 8.5 1.2 python3
www-data 0.7 2.2 nginx
root 0.1 0.1 systemd
--- 메모리 사용량 상위 5개 ---
USER %CPU %MEM COMMAND
www-data 0.7 2.2 nginx
student 0.0 1.8 java
mysql 0.0 1.5 mysqld
--- 프로세스 상태 요약 ---
S: 138개
R: 2개
I: 2개
--- 시스템 부하 ---
10:35:22 up 1:35, 2 users, load average: 0.12, 0.08, 0.05
이 리포트 스크립트를 cron에 등록하면 주기적인 시스템 모니터링 로그를 자동으로 남길 수 있습니다. cron은 PART 09에서 자세히 다룹니다.