ps 명령을 사용하여 Linux 프로세스를 모니터링하는 방법

Linux 환경에서 실행 중인 프로세스들을 파악하고 관리하는 것은 시스템 운영의 중요한 부분입니다. ps 명령어는 이러한 프로세스들의 현재 상태를 보여주는 스냅샷을 제공하며, 이를 통해 프로세스 이름, 사용자 정보 등 필요한 세부 정보를 터미널에서 확인할 수 있습니다. 본문에서는 ps 명령어를 효과적으로 사용하는 다양한 방법들을 자세히 설명합니다.

리눅스 시스템에서의 프로세스 관리

리눅스와 유닉스 기반 운영체제의 핵심에는 커널이 자리 잡고 있습니다. 커널의 주된 역할 중 하나는 시스템 리소스를 효율적으로 관리하는 것입니다. 특히 RAM과 CPU 시간과 같은 중요한 자원들을 실시간으로 조율하여 각 프로세스가 공평하게 자원을 할당받도록 합니다. 이는 실행 중인 모든 작업의 우선순위를 고려하여 이루어집니다.

때로는 어떤 프로세스가 무응답 상태에 빠지거나, 과도한 루프에 갇히거나, 또는 다른 이유로 인해 정상적인 작동을 멈출 수 있습니다. 또한, 일부 프로세스는 실행은 되지만 CPU나 RAM을 과도하게 소모하여 시스템 성능에 악영향을 미칠 수 있습니다. 이런 경우, 문제의 프로세스를 식별하고 적절히 조치해야 합니다. ps 명령어는 이러한 상황에서 문제 해결의 첫 단계를 가능하게 합니다.

하지만 문제가 발생하지 않더라도, 시스템 내부에서 어떤 프로세스들이 실행되고 있는지 확인하고 싶을 수 있습니다. ps 명령어는 시스템 내부에서 어떤 일이 일어나고 있는지 “바로 지금” 확인할 수 있도록 스냅샷을 제공합니다. 이는 시스템 관리 및 모니터링에 매우 유용합니다.

ps 명령어는 다양한 옵션을 통해 사용자가 원하는 정보를 원하는 형식으로 정확하게 제공할 수 있도록 유연하게 설계되었습니다. 본문에서 소개되는 옵션들은 가장 일반적인 요구를 충족시키며, 더 깊이 있는 사용법은 매뉴얼 페이지를 참고하시면 도움이 될 것입니다.

기본적인 프로세스 목록 확인

ps 명령어는 아무런 매개변수 없이 실행할 수 있으며, 이는 가장 기본적인 사용법입니다.

ps

위 명령어를 실행하면, 해당 명령어를 실행한 사용자가 시작한 프로세스 목록이 나타납니다.

출력 결과는 다음과 같은 네 가지 열로 구성됩니다:

PID 프로세스의 고유한 프로세스 ID 번호
TTY 사용자가 로그인한 터미널의 이름
TIME 프로세스가 사용한 총 CPU 시간
CMD 프로세스를 실행한 명령어

모든 사용자 프로세스 보기

-e 옵션을 사용하여 ps 명령어를 실행하면, 현재 사용자뿐만 아니라 시스템의 모든 사용자가 시작한 프로세스 목록을 확인할 수 있습니다. 이 목록은 매우 길어질 수 있으므로, less 명령어를 함께 사용하여 결과를 페이지 단위로 확인할 수 있습니다.

ps -e | less

결과를 less로 파이프하여 쉽게 확인 가능합니다.

출력 결과에는 더 많은 항목이 표시되지만, 이전과 같은 네 가지 기본 열이 나타납니다. TTY 열에 물음표(?)가 있는 항목은 터미널 창에서 시작되지 않은 프로세스를 의미합니다.

프로세스 계층 구조 표시

프로세스 간의 관계를 파악하는 것은 문제 해결이나 특정 프로세스를 식별하는 데 도움이 될 수 있습니다. -H 옵션을 사용하면 프로세스의 계층 구조를 확인할 수 있습니다.

ps -eH | less

들여쓰기는 각 프로세스의 부모-자식 관계를 나타냅니다.

더욱 명확한 시각화를 위해, --forest 옵션을 사용하여 ASCII 선을 통해 프로세스 계층 구조를 트리 형태로 표시할 수 있습니다.

ps -eH --forest | less

이 옵션은 어떤 프로세스가 다른 프로세스의 부모인지 쉽게 파악할 수 있도록 도와줍니다.

이름으로 프로세스 검색

ps 명령어의 출력을 grep과 함께 사용하면 특정 이름과 일치하는 프로세스를 쉽게 찾을 수 있습니다. 다음 예제에서는 “firefox”라는 이름을 가진 프로세스를 검색합니다.

ps -e | grep firefox

만약 여러 개의 Firefox 인스턴스가 실행 중이라면, 해당 프로세스들이 모두 목록에 표시됩니다.

더 많은 정보 표시

출력 결과에 더 많은 열을 추가하려면 -f 옵션을 사용합니다.

ps -ef | less

이 옵션은 추가적인 프로세스 정보를 제공합니다.

UID 프로세스 소유자의 사용자 ID
PID 프로세스 ID
PPID 부모 프로세스 ID
C 프로세스의 자식 프로세스 수
STIME 프로세스 시작 시간
TTY 사용자가 로그인한 터미널 이름
TIME 프로세스가 사용한 CPU 시간
CMD 프로세스를 시작한 명령어

-F 옵션을 사용하면 더 많은 열 정보를 확인할 수 있습니다.

ps -eF | less

이 경우에는 화면을 가로로 스크롤해야 모든 열을 볼 수 있습니다.

오른쪽 화살표 키를 눌러 디스플레이를 왼쪽으로 이동시켜 숨겨진 열을 확인할 수 있습니다.

UID 프로세스 소유자의 사용자 ID
PID 프로세스 ID
PPID 부모 프로세스 ID
C 프로세스의 자식 프로세스 수
SZ 프로세스 이미지의 RAM 페이지 크기
RSS 프로세스가 사용하는 실제 메모리 크기
PSR 프로세스가 할당된 프로세서
STIME 프로세스 시작 시간
TTY 사용자가 로그인한 터미널 이름
TIME 프로세스가 사용한 CPU 시간
CMD 프로세스를 시작한 명령어

프로세스 ID로 프로세스 검색

특정 프로세스의 ID를 알고 있다면, -p 옵션을 사용하여 해당 프로세스의 상세 정보를 확인할 수 있습니다.

ps -p 3403

해당 프로세스에 대한 상세 정보가 표시됩니다.

하나 이상의 프로세스 ID를 공백으로 구분하여 동시에 확인할 수도 있습니다.

명령어로 프로세스 검색

-C 옵션을 사용하여 프로세스를 실행한 명령어 이름으로 검색할 수 있습니다. 명령어 이름은 전체 경로와 매개변수를 포함하는 명령줄과는 다릅니다.

ps -C shutter

위 명령어는 “shutter”라는 이름의 프로세스 상세 정보를 출력합니다.

사용자 소유 프로세스 검색

특정 사용자가 소유한 프로세스를 확인하려면 -u 옵션을 사용합니다.

ps -u mary

위 명령어는 “mary” 계정의 사용자가 소유한 프로세스 목록을 출력합니다.

터미널 관련 프로세스 검색

특정 터미널과 관련된 프로세스를 확인하려면 -t 옵션을 사용합니다. -t 옵션을 터미널 번호 없이 사용하면 현재 터미널 창과 관련된 프로세스 목록이 표시됩니다.

tty
ps -t

tty 명령어는 현재 터미널이 pseudo-terminal 0임을 나타냅니다. ps -t 명령어로 표시된 모든 프로세스는 TTY pts/0과 연결되어 있습니다.

명령줄에 터미널 번호를 전달하면 해당 TTY와 관련된 프로세스 목록을 확인할 수 있습니다.

ps -t 1

이 예에서는 TTY pts/1과 연결된 프로세스 목록을 보여줍니다.

표시할 열 선택

-o 옵션을 사용하면 ps 명령어 출력에 포함할 열을 선택할 수 있습니다. 열 이름은 매뉴얼 페이지에서 “표준 형식 지정자” 섹션에서 찾을 수 있습니다. 다음 예에서는 CPU 시간(pcpu)과 명령어 인자(args)를 선택하여 출력에 포함시켰습니다.

ps -e -o pcpu,args | less

요청한 두 열만 출력됩니다.

열 기준으로 출력 정렬

--sort 옵션을 사용하면 특정 열을 기준으로 출력 결과를 정렬할 수 있습니다. 다음 예에서는 CPU 사용률(pcpu)을 기준으로 내림차순 정렬합니다.

ps -e -o pcpu,args --sort -pcpu| less

정렬 매개변수 앞에 하이픈(‘-‘)을 붙이면 내림차순으로 정렬됩니다.

CPU 사용률이 가장 높은 상위 10개 프로세스를 보려면 head 명령어를 함께 사용합니다.

ps -e -o pcpu,args --sort -pcpu | head -10

정렬된 상위 10개 프로세스 목록이 표시됩니다.

출력에 더 많은 열을 추가하면 더 다양한 기준으로 정렬할 수 있습니다. 예를 들어, 프로세스에서 사용하는 메모리 비율(pmem)을 추가해 보겠습니다. 하이픈(‘-‘) 또는 플러스 기호(‘+’)를 사용하지 않으면 오름차순으로 정렬됩니다.

ps -e -o pcpu,pmem,args --sort -pcpu,pmem | head -10

추가된 열(pmem)을 기준으로 오름차순으로 정렬됩니다. 첫 번째 정렬 기준은 CPU 사용률(pcpu)로 내림차순으로 적용됩니다.

더 유용하게 만들기 위해, 프로세스 ID(pid) 열을 추가하여 각 프로세스의 번호를 표시합니다.

ps -e -o pid,pcpu,pmem,args --sort -pcpu,pmem | head -10

이제 프로세스를 쉽게 식별할 수 있습니다.

프로세스 ID를 사용하여 프로세스 종료

이름, 명령어, 사용자, 터미널 등 다양한 방법으로 프로세스를 식별하는 방법을 알아보았습니다. 또한 CPU 사용량 및 메모리와 같은 동적 속성으로 프로세스를 식별하는 방법도 확인했습니다. 이제 프로세스 ID를 알면 kill 명령어를 사용하여 해당 프로세스를 종료할 수 있습니다. 예를 들어, 프로세스 ID가 898인 프로세스를 종료하려면 다음 형식을 사용합니다.

sudo kill 898

정상적으로 종료되면 프로세스가 자동으로 중단됩니다.

이름으로 프로세스 종료

pkill 명령어를 사용하면 프로세스 이름으로 프로세스를 종료할 수 있습니다. 종료하려는 프로세스를 정확히 확인해야 합니다. 이 명령어는 최상위 프로세스를 종료합니다.

sudo pkill top

아무런 메시지가 없으면 정상적으로 종료된 것입니다. 프로세스가 자동으로 종료됩니다.

이름으로 여러 프로세스 종료

실행 중인 동일한 프로세스가 여러 개 있거나 프로세스가 여러 하위 프로세스를 생성한 경우(예: 구글 크롬) 어떻게 종료할 수 있을까요? killall 명령어를 사용하면 됩니다. top 명령어를 두 번 실행하여 두 개의 프로세스가 실행 중인 상황을 가정해 봅시다.

ps -e | grep top

다음 명령어는 두 프로세스를 모두 종료할 수 있습니다.

sudo killall top

아무런 응답이 없다는 것은 문제없이 두 프로세스가 종료되었다는 의미입니다.

top 명령어로 동적 프로세스 보기

ps 명령어의 출력은 스냅샷과 같아서 현재 상태만 보여주고 업데이트되지 않습니다. 프로세스의 업데이트된 보기를 얻으려면 top 명령어를 사용합니다. top 명령어는 현재 실행 중인 프로세스들의 동적인 상태를 제공합니다. top 명령어의 디스플레이는 두 부분으로 나뉩니다. 화면 상단에는 텍스트 행으로 구성된 대시보드 영역이 있고, 하단에는 열로 구성된 테이블이 있습니다.

다음 명령어를 입력하여 top 명령어를 실행합니다.

top

각 열은 프로세스에 대한 정보를 제공합니다.

PID 프로세스 ID
USER 프로세스 소유자 이름
PR 프로세스 우선순위
NI 프로세스 nice 값
VIRT 프로세스가 사용하는 가상 메모리
RES 프로세스가 사용하는 상주 메모리
SHR 프로세스가 사용하는 공유 메모리
S 프로세스 상태 (아래 표 참조)
%CPU 마지막 업데이트 이후 프로세스에서 사용한 CPU 시간
%MEM 프로세스에서 사용한 실제 메모리 비율
TIME+ 작업에서 사용한 총 CPU 시간(1/100초)
COMMAND 명령어 이름 또는 명령줄

프로세스 상태는 다음 중 하나가 될 수 있습니다.

D 중단할 수 없는 Sleep
R 실행 중
S 대기 중
T 추적 중 (중지됨)
Z 좀비

top 명령어를 종료하려면 ‘Q’ 키를 누릅니다.

프로세스 종료 전 확인사항

프로세스를 종료하기 전에, 해당 프로세스가 실제로 종료하려는 프로세스인지 확인해야 합니다. 특히 -H 옵션이나 --forest 옵션을 사용하여 중요한 자식 프로세스가 없는지 확인하는 것이 중요합니다.