[Linux] Linux 프로세스 상태값 정리

강윤서·2026년 9월 4일

Linux

목록 보기
13/13

1. 프로세스 상태값(Process State Codes)

리눅스 시스템에서 ps, top, htop 명령어를 실행했을 때 STAT 또는 S항목에 표시되는 프로세스 상태값(Process State Codes)를 정리합니다.

1) R - Running

프로세스가 현재 CPU에서 실행 중이거나, CPU를 할당받기 위해 실행 큐에서 기다리고 있는 상태

  • R이라고 해서 반드시 그 순간 CPU를 사용하고 있는 것은 아님

2) S - Sleeping

프로세스가 이벤트, 입력, 네트워크 응답, I/O 완료 등을 기다리는 대기 상태

3) D - Uninterruptible Sleep

중단 불가능한 대기 상태
S 와 비슷하지만, 주로 디스크나 특정 하드웨어 I/O 작업이 완료되기를 기다리는 상태

  • D 상태가 오랫동안 많이 발생한다면 시스템 성능 문제를 의심
  • 서버가 느린데 CPU 사용률이 낮다면 중요한 확인 대상임

4) T - Stopped

프로세스가 일시적으로 멈춘 상태

Ctrl + Z : 멈춤
fg : 해제

5) Z - Zombie

프로세스 실행 자체는 끝났지만, 부모 프로세스가 자식의 종료 상태를 아직 wait 등으로 회수하지 않은 상태

2. ps aux 명령어의 추가 기호

ps aux : 리눅스 및 유닉스 시스템에서 현재 실행 중인 모든 프로세스의 상세한 상태를 스냅샷 형태로 출력하는 명령어

1) < : 높은 우선순위(High Priority)

다른 프로세스보다 CPU 자원을 더 먼저, 많이 할당받는 상태(nice 값이 낮음)

2) N : 낮은 우선순위(Low Priority)

다른 프로세스에 양보하도록 설정된 상태(nice 값이 높음)

3) L : 메모리 락(Locked Pages)

실시간 시스템이나 빠른 처리를 위해 메모리 페이지가 디스크(swap)으로 빠져나가지 않도록 고정된 상태

4) s : 세션 리더(Session Leader)

해당 프로세스가 하나의 세션(Session)을 생성하고 관리하는 세션 리더

5) l : 멀티스레드(Multi Threaded)

하나의 프로세스 안에서 여러 개의 스레드가 동시에 동작하고 있는 상태

6) + : 포어그라운드 프로세스

현재 터미널 창에서 사용자와 직접 상호작용하며 실행 중인 프로세스 그룹에 속해 있음

7) 예시

  • Ss : 인터럽트가 가능한 대기(S)상태이면서, 세션 리더(s)인 프로세스
  • Ss+ : 인터럽트가 가능한 수면(S)상태이면서, 세션 리더(s)인 프로세스이면서, 터미널 앞에서 동작하고 있는 포어그라운드(+) 프로세스
  • I< : 현재 쉬고 있지만(I), 실행될 때 높은 우선순위(<)를 가지는 커널 스레드
    ** I - Idle : 현재 유휴 상태인 커널 스레드

3. 트러블 슈팅

1. 서버가 느린데 CPU 사용량이 0%인 경우\

-> D 상태 프로세스 확인

ps aux

또는

ps -eo pid,stat,comm

으로 D 상태 프로세스 확인

D 상태가 많거나 오래 유지된다면 디스크/스토리지/NFS 등의 I/O 병목 현상을 의심해보기!


2. 좀비 프로세스(Z)를 죽이고 싶을 때

kill -9 <Zombie PID>

좀비 프로세는 실행이 이미 끝났기 때문에 좀비 프로세스 자체를 kill 하는 것으로 해결되지 않음

ps -eo pid,ppid,stat,cmd

로 부모 프로세스 PPID 확인

좀비 프로세스의 문제는 부모가 자식의 종료 상태를 wait()로 회수하지 않았다는 것이므로 부모 프로세스가 정상적으로 자식 프로세스를 회수하도록 해야 함

즉, PPID 확인 -> 부모 프로세스 상태 확인 -> 부모가 자식 종료 상태 회수하도록 조치 -> 필요 시 부모 프로세스를 정상 종료하거나 재시작


3. 프로세스가 생겨나자마자 순식간에 사라질 때

1. watch -n 0.5 'ps aux'

반복 관찰하기

2-1. systemctl status <서비스명>
2-2. journalctl -u <서비스명>

watch를 이용하면 프로세스를 반복적으로 관찰할 수 있지만, 매우 짧게 실행되고 종료되는 프로세스는 놓칠 수 있다.

systemd 서비스라면 systemctl status <서비스명> 으로 서비스 상태와 최근 실행 정보를 확인하고, journalctl -u <서비스명>으로 상세 로그를 확인하여 종료 원인을 찾는다.

프로그램을 직접 실행할 수 있다면 실행 직후 echo $?를 통해 종료 코드(exit code)를 확인하는 것도 도움이 된다.

ps aux 를 실행하는 순간 이미 프로세스가 종료됐을 수 있기 때문의 위의 명령어를 통해 로그를 확인하여 조치를 취해야 한다.

4. 정리

리눅스의 프로세스 상태값을 통해 프로세스가 현재 실행 중인지, 대기 중인지, 정지 또는 종료된 상태인지 확인할 수 있다.

상태의미핵심
R (Running)실행 중 / 실행 준비CPU를 사용 중이거나 CPU 할당을 기다리는 상태
S (Sleeping)이벤트 대기이벤트, 입력, I/O 완료 등을 기다리는 정상적인 대기 상태
D (Uninterruptible Sleep)중단 불가능한 대기주로 디스크·스토리지 등 I/O 작업이 끝나기를 기다리는 상태
T (Stopped)일시 정지시그널이나 디버거 등에 의해 실행이 멈춘 상태
Z (Zombie)좀비 상태실행은 종료됐지만 부모가 종료 정보를 아직 회수하지 않은 상태

트러블 슈팅 핵심

  • 서버가 느린데 CPU 사용률이 낮다 → D 상태 프로세스를 확인하고 I/O 병목 여부를 점검한다.
  • 좀비 프로세스(Z)가 발생한다 → 좀비 자체가 아닌 부모 프로세스(PPID)를 확인한다.
  • 프로세스가 생성 직후 사라진다 → watch로 관찰하고, systemctl, journalctl, exit code 등을 통해 종료 원인과 로그를 확인한다.

결국 프로세스 상태값은 단순히 현재 상태를 나타내는 것뿐만 아니라, CPU·I/O 병목, 비정상 종료, 좀비 프로세스 등의 문제 원인을 파악하는 중요한 단서로 활용할 수 있다.

profile
감사합니다! 복 받으세요!

0개의 댓글