iBetter Books
수정

프로세스 확인 (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에서 자세히 다룹니다.