작업을 하다 보면 프로그램이 갑자기 멈추거나(프리징), 실행은 되고 있지만 CPU나 메모리를 과도하게 점유하는 경우가 종종 발생합니다. 이럴 때 리눅스에서는 ps(Process Status) 명령어를 활용하면 문제를 해결할 수 있습니다. 이 글에서는 ps 명령어로 현재 실행 중인 프로세스와 각 프로세스의 PID(프로세스 ID)를 확인하고, 시스템 자원을 잡아먹는 프로세스를 찾아 종료하는 방법까지 단계별로 소개합니다.
ps 명령어 기본 사용법
ps 명령어는 옵션 없이 단독으로 사용할 수 있으며, 실행하면 다음 네 가지 정보가 출력됩니다.
- PID: 시스템이 부여한 프로세스의 고유 식별자. 프로세스를 종료할 때 사용하는 값입니다.
- TTY: 해당 프로세스가 시작된 터미널.
- TIME: 프로세스가 사용한 총 CPU 시간.
- CMD: 해당 프로세스를 생성한 명령어.
다만 옵션 없이 실행하면 출력되는 정보가 매우 제한적입니다. 아래 방법들을 활용하면 훨씬 유용하게 사용할 수 있습니다.
1. 모든 사용자의 프로세스 목록 보기
일부 프로그램은 설치될 때 프로세스를 실행하기 위한 별도의 사용자 계정을 생성하기도 합니다. 시스템 전체 사용자의 프로세스를 나열하려면 -e 옵션을 사용합니다.
ps -e
실행 결과 예시:
PID TTY TIME CMD 1 ? 00:00:02 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 kworker/0:0 4 ? 00:00:00 kworker/0:0H 5 ? 00:00:00 kworker/u256:0 6 ? 00:00:00 mm_percpu_wq
2. 상세 정보와 함께 프로세스 목록 보기
실행 중인 프로세스에 대해 더 자세한 정보를 확인하려면 -ef 옵션을 사용하면 됩니다. UID, PPID(부모 프로세스 ID), 시작 시간 등 추가 정보가 함께 표시됩니다.
ps -ef
실행 결과 예시:
UID PID PPID C STIME TTY TIME CMD root 1 0 0 21:34 ? 00:00:03 /sbin/init maybe-ubiquity root 2 0 0 21:34 ? 00:00:00 [kthreadd] root 3 2 0 21:34 ? 00:00:00 [kworker/0:0] root 4 2 0 21:34 ? 00:00:00 [kworker/0:0H] root 6 2 0 21:34 ? 00:00:00 [mm_percpu_wq] root 7 2 0 21:34 ? 00:00:00 [ksoftirqd/0]
3. PID로 특정 프로세스만 필터링하기
확인하려는 프로세스의 PID를 이미 알고 있다면 -p 옵션으로 해당 프로세스만 골라서 볼 수 있습니다. 여러 개의 PID를 지정할 경우 쉼표로 구분하되 공백 없이 입력해야 합니다.
ps -ef -p 1234,5678,9012
4. 특정 사용자가 소유한 프로세스 목록 보기
-u 옵션 뒤에 사용자 이름을 붙이면 해당 사용자가 실행한 프로세스만 나열할 수 있습니다.
ps -u userName
실행 결과 예시:
PID TTY TIME CMD 2832 ? 00:00:00 systemd 2842 ? 00:00:00 (sd-pam) 3043 ? 00:00:00 sshd 3044 pts/1 00:00:00 bash 18396 pts/1 00:00:00 ps
5. 활성화된 모든 프로세스 목록 보기
-ax 옵션을 사용하면 현재 시스템에서 동작 중인 모든 프로세스를 확인할 수 있습니다. STAT 항목이 추가되어 프로세스 상태까지 알려줍니다.
ps -ax
실행 결과 예시:
PID TTY STAT TIME COMMAND 1 ? Ss 0:02 /sbin/init maybe-ubiquity 2 ? S 0:00 [kthreadd] 3 ? I 0:00 [kworker/0:0] 4 ? I< 0:00 [kworker/0:0H] 6 ? I< 0:00 [mm_percpu_wq] 7 ? S 0:00 [ksoftirqd/0]
6. 사용자 정보와 함께 활성 프로세스 보기
-aux 옵션을 추가하면 어떤 사용자가 어떤 프로세스를 실행 중인지, 그리고 CPU·메모리 점유율까지 한눈에 파악할 수 있습니다. 실무에서 가장 많이 쓰이는 조합입니다.
ps -aux
실행 결과 예시:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 78132 9188 ? Ss 21:34 0:02 /sbin/init maybe-ubiquity root 2 0.0 0.0 0 0 ? S 21:34 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? I 21:34 0:00 [kworker/0:0] root 4 0.0 0.0 0 0 ? I< 21:34 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? I< 21:34 0:00 [mm_percpu_wq] root 7 0.0 0.0 0 0 ? S 21:34 0:00 [ksoftirqd/0]
7. 프로그램 이름으로 프로세스 검색하기
특정 프로그램의 실행 정보를 확인하려면 grep과 조합하여 ps 결과를 필터링할 수 있습니다.
ps -aux | grep docker
실행 결과 예시:
root 1508 0.0 2.2 1518156 90868 ? Ssl 21:34 0:03 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock userkub+ 18429 0.0 0.0 13144 1108 pts/1 S+ 23:57 0:00 grep --color=auto docker
또는 -C 옵션을 사용해 프로그램 이름으로 직접 필터링할 수도 있습니다.
ps -C name
8. 원하는 열(Column)만 선택해서 출력하기
기본 4개 열 외에도 -o 옵션으로 원하는 정보만 골라 출력할 수 있습니다. 예를 들어 PID, 사용자명, CPU 사용률, 메모리 사용률, 명령어를 함께 보려면 다음과 같이 입력합니다.
ps -e -o pid,uname,pcpu,pmem,comm
-o 플래그는 ps 명령어의 출력 형식을 지정하는 옵션으로, 리소스 점유율 순으로 정렬해 분석할 때 특히 유용합니다.
9. 트리 구조로 프로세스 계층 보기
ps -e --forest
--forest 옵션은 ASCII 문자로 트리 형태의 구조를 만들어 프로세스를 표시합니다. 부모 프로세스에서 fork된 자식 프로세스들이 계층적으로 정렬되어 출력되므로, 프로세스 간 관계를 파악하기 좋습니다. 트리의 '가지' 선을 숨기고 싶다면 --forest 대신 -H 옵션을 사용하세요.
10. 특정 프로세스의 스레드(Thread) 보기
ps -p 4041 -L
-L 플래그는 ps의 모든 기능에 대해 스레드 단위 표시를 활성화합니다. 특정 프로세스가 생성한 스레드를 추적할 때 가장 유용하게 쓰입니다.
11. root 권한으로 실행 중인 모든 프로세스 보기
ps -f -U root -u root
실제 UID(real)와 유효 UID(effective)가 root인 모든 프로세스를 검색합니다. -f 플래그 덕분에 풀 포맷(full-format)으로 표시되며, -o 플래그와 조합하면 출력 형식을 자유롭게 커스터마이징할 수 있습니다.
kill 명령어로 프로세스 종료하기
문제를 일으키는 프로세스를 찾았다면 이제 kill 명령어로 해당 프로세스를 종료할 수 있습니다. kill은 프로세스에 종료 신호(signal)를 보내는 명령어입니다. 프로그램이 완전히 멈춰 정상적인 종료 신호에 반응하지 않는 경우가 대부분이며, 이럴 때는 -9(SIGKILL) 옵션으로 강제 종료해야 합니다.
kill -9 [PID]
참고로 ps의 출력은 순간적인 스냅샷이라는 점을 기억하세요. htop 같은 도구와 달리 실시간으로 갱신되지 않기 때문에, 문제가 되는 프로세스를 정확히 파악하려면 여러 번 실행해야 할 수도 있습니다. 실시간 모니터링이 필요하다면 top, htop 같은 다른 시스템 모니터링 명령어를 함께 활용하는 것을 추천합니다.