Computer >> 컴퓨터 >  >> 시스템 >> Linux

리눅스 ps 명령어로 프로세스 조회하고 kill로 종료하는 방법 총정리

작업을 하다 보면 프로그램이 갑자기 멈추거나(프리징), 실행은 되고 있지만 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 같은 다른 시스템 모니터링 명령어를 함께 활용하는 것을 추천합니다.