본문 바로가기

별걸다하는 IT/리눅스 유닉스

[리눅스, 유닉스] ps 프로세스 명령어 완벽정리, 프로세스 관리, 계열에 따른 옵션 차이, 조건에 맞게 프로세스 정보 추출하기

반응형

[리눅스 유닉스 포스팅 링크 모음]

안녕하세요 

오늘 들고온 포스팅은 ps 명령어 관련입니다.

프로세스(process)의 약자로 추정되는 명령어 ps는 현재 돌아가고 있는 프로세스를 확인할 수 있는 명령어인데요, --> 아 Process Status의 약자라고 합니당. 암튼 무엇보다 업무에서 매우 많이 사용됩니다.

ps 명령어 언제 사용할까? 사용 상황 간단 예시

아무래도 서버에는 다수의 사용자가 접근하다보니,,,  

난 아무것도 안했는데 갑자기 느려질 수 있어요. 그럼 top(topas) 또는 'ps -ef' 이 두 명령어를 이용해서 CPU사용률과 사용 중인 프로세스를 체크하기 시작하죠.

 

또는 어떤 스크립트를 돌리다가, 예가 중간에 멈췄어!! 근데 뻑난건지 진행중인건지 락걸렸는지 아무것도 안먹어~! 그럼 프로세스가 돌고 있는 지 확인해주고, 그 프로세스가 돌고 있다면 강제 종료 해줘야겠죠??

 

네.. 이 포스팅을 지금 쓰고 있는 이유도, 지금 제가 작업하는 프로세스가 뻑났기 때문입니다. ㅋㅋㅋ 소스 검증 돌리는거 너무 CPU를 많이 잡아먹어요 한두개만 돌렸어야 했는데...흐규흐규

 

사실 'ps -ef'만 알고 있어도 돼요. 이것만 주구장창 쓰기 때문에..

하지만 이번에 기회를 삼아서 ps 명령어의 다양한 옵션과 예시를 살펴보고 지나가도록 합시다.

ps 명령어 

ps 명령어는 현재 실행중인 프로세스 목록과 상태를 보여줍니다.

ps의 옵션은 전통적인 유닉스인 System V, BSD, GNU에 따라 결과가 다르게 나타나고 표기법에도 차이를 보입니다. 옵션 사용 시 System V 계열은 대시(dash, -)를 사용하고 BSD 계열은 대시(-)를 사용하지 않습니다. GNU에서의 옵션 표기는 두 개의 대시(--)를 사용합니다. 따라서 원하는 프로세스의 상태를 출력하려면 정확한 옵션 사용이 중요합니다.

 

 한 예로, 옵션 중 'a'가 있고 '-a'가 있는데 이 둘은 달라요!!

man ps로 본 설명인데요, 이거 봐요 'a'가 있고 '-a'가 있죠?? 이런게 많이 있으니까 표기법에 따라 달라진다는 것을 짚고 넘어가지 않으면 나중에 큰 혼란이 올 수 있어요 ㅎㅎ

 

ps 사용법

$ ps [option]

 

ps 옵션 OPTIONS

다 살펴보긴 어렵지만 AIX 에서의 ps 옵션입니다.

BSD계열이라고 해서 System V계열에서 아예 사용이 안되고 이런게 아니예요. ㅎㅎ 위에 언급한대로 표기법이 다르다는거! 운영체제마다 지원하는 옵션들이 조금씩 상이한 거 알고 있죠??ㅎㅎ 대표적인 것만 보고 자세한 것은 man 명령어를 참조해주도록 합시다.

옵션  내용
-A

writes to standard output information about all processes.

모든 프로세스를 출력한다.

a (BSD계열) 

터미널과 연관된 프로세스를 출력하는 옵션이다. 보통 x 옵션과 연계하여 모든 프로세스를 출력할 때 사용한다. 

-a

세션 리더(일반적으로 로그인 셸)을 제외하고 데몬 프로세스처럼 터미널에 종속되지 않은 모든 프로세스를 출력한다.

-e

writes information to standard output about all processes, except kernal processes.

커널 프로세스를 제외한 모든 프로세스를 출력해 준다.

-f

풀 포맷으로 보여준다 (Generates a full listing) 

유닉스 스타일로 출력해주는 옵션으로 UID, PID, PPID등이 함께 표시된다.

-l (sys V)

l (BSD계열) 

긴 포맷으로 보여준다. (Generates a long listing.)

프로세스의 정보를 길게 보여주는 옵션으로 우선순위와 관련된 PRI와 NI값을 확인할 수 있다. 

-o 값

출력 포맷을 지정하는 옵션으로 값으로는 pid, tty, time, cmd 등을 지정할 수 있다.

-M 64비트 프로세스들을 보여준다.
-m 프로세스들 뿐만 아니라 커널 스레드들도 보여준다. 
-p 특정 PID를 지정할 때 사용합니다 
-r 현재 실행 중인 프로세서를 보여준다. 
u (BSD계열)  프로세스의 소유자를 기준으로 출력한다. (ps ax만 하면 USER 기준의 정보가 안뜸, 따라서 aux 이렇게 같이 대게 써준다) 
-u 특정 사용자의 프로세스 정보를 확인할 때 사용한다. 사용자를 지정하지 않으면 현재 사용자를 기준으로 정보를 출력한다. 
x (BSD계열) 데몬 프로세스처럼 터미널에 종속되지 않는 프로세스를 출력한다. 보통 a옵션과 결합하여 모든 프로세스를 출력할 때 사용한다.
-x 로그인 상태에 있는 동안 아직 완료되지 않은 프로세서들을 보여준다. 유닉스 시스템은 사용자가 로그아웃 한 후에도 임의의 프로세서가 게속 동작하게 할 수 있다. 그러면 그 프로세서는 자신을 실행시킨 셸이 없이도 계속 자신의 일을 수행하는데 이러한 프로세스는 일반적인 ps 명령으로 확인할 수 잆다. 이 때 -x 옵션을 사용하면 자신의 터미널이 없는 프로세서들을 확인할 수 있다. 

 

특정 프로세스를 확인하는데 주로 grep이라는 명령어와 함께 사용합니다.

System V 계열에선 'ps -ef'를 가장 많이 사용해요 

 

ps -ef | grep '프로세스명'

 

BSD 계열에선 'ps aux'를 가장 많이 사용합니다 

 

ps aux | grep '프로세스명'

 

차근차근 사용 예시들을 살펴볼게요

ps명령어와 ps가 보여주는 항목, 필드 의미 

$ ps

ps명령어만 단독으로 사용하였을 때의 결과예요.

사용자와 관련된 프로세스를 출력해줍니다. ps는 이렇게 단독적으로 사용되기보다 거의 옵션들과 같이 사용되는 경우가 많습니다.

왼: 리눅스 오: UNIX

기본적으로 PID, TTY, TIME, CMD 이렇게 네 개의 정보가 출력됩니다. 

PID는 프로세스 번호죠, TTY는 프로세스가 연결된 터미널을 의미합니다. (tty가 뭔지 모르시는 분은 이 링크를 참조해주세요) 이건 아주아주 기본적인 정보일 뿐 옵션에 따라 더 자세한 내용들을 알려주기도 해요.

이런식으로요!! F가 무엇인지 S가 무엇인지 PPID는 뭔지 각 필드가 무엇을 의미하는지 모르면 데이터를 보여줘도 이해할 수가 없겠죠. ps로 알 수 있는 대표적인 정보들을 한 번 정리해봅시다.

 

ps 항목

항목 의미
USER BSD계열에서 나타나는 항목으로 프로세스 소유자의 이름
UID SYSTEM V계열에서 나타나는 항목으로 프로세스 소유자의 이름
PID 프로세스의 식별변호 
PPID 부모 프로세스 ID
%CPU CPU 사용 비율의 추정치(BSD)
%MEM 메모리의 사용 비율의 추정치 (BSD)
VSZ K단위 또는 페이지 단위의 가상메모리 사용량
RSS 실제 메모리 사용량 (Resident Set Size)
TTY 프로세스와 연결된 터미널 
S, STAT 현재 프로세스의 상태 코드 (S: Sys V, STAT: BSD)
TIME 총 CPU 사용 시간
COMMAND 프로세스의 실행 명령행
STIME 프로세스가 시작된 시간 혹은 날짜
C, CP 짧은 기간 동안의 CPU 사용률 (C: Sys V, CP: BSD)
F 프로세스의 플래그 
PRI 실제 실행 우선순위
NI nice 우선순위 번호 

ps 명령어 사용 예시 examples

$ ps ax

시스템에 동작중인 모든 프로세스를 보고 싶을 때 위와 같은 명령어를 사용하면 BSD 포맷으로 출력해줍니다. (UNIX에서는 주로 'ps -e'와 비슷)

ps ax결과

PID, TTY, STAT, TIME, COMMAND 정보가 뜹니다. 그런데 사용자 기준의 다양한 정보들을 출력해주고 싶으면 u옵션을 껴서 aux로 명령어를 구성해주면 됩니다. 

 

$ ps aux 

시스템에 동작중인 모든 프로세스를 소유자 정보와 함께 다양한 정보를 출력합니다. (BSD 포맷으로 출력) 

짠! 필드들이 늘어났죠? USER도 생기고, %CPU, %MEM, VSZ, RSS 등등 다양한 정보를 한 번에 보기 쉽게 출력해줬어요. 그래서 BSD계열에서는 'ps aux' 명령어를 가장 흔하게 사용합니다.

 

$ ps aux | grep apache

이런식으로 특정 프로세스에 대해서 보고 싶을 경우 'grep'명령어를 같이 활용해줍시다.

 

$ ps -ef | more

'ps -ef'는 System V 계열 옵션으로 'ps aux'처럼 시스템에 동작중인 모든 프로세스를 full format으로 (즉 자세히) 출력합니다. 근데 여기에 more명령어를 이용해서 추가로 한 페이지씩 화면에 출력되도록 해줬어요.

UID, PID, PPID, C, STIME, TTY, TIME, CMD 정보를 볼 수 있어요.

 

$ ps -el | head

긴 포맷으로 출력하고 싶을 경우 -l 옵션을 사용해줍시다. 보면 'ps -ef'에서 보이지 않았던, F, S, PRI, NI, ADDR~ 등등 더 많은 정보들이 출력되는 것을 확인할 수 있어요.

사실 왠만큼 'ps -ef'로 충분한데 프로세스 상태나 우선순위를 확인하고 싶을 경우 -l 옵션으로 확인해줍시다.

 

$ ps -fp [PID]

PID를 키워드로 프로세스 정보를 확인하는 방법입니다. -p옵션을 써주시면 돼요.

full format으로 PID가 1219인 프로세스 정보를 출력하라!

 

$ ps -U root -u root

특정 사용자가 돌리는 프로세스의 정보를 알고 싶을 때 real uid와 uid를 의미하는 옵션으로 셀렉할 수 있습니다.

위 예시는 root가 돌리는 프로세스를 확인하는 명령어네요!

사진에서는 좀 더 자세한 결과를 확인하기 위해 -ef 옵션도 추가적으로 넣어줬어요. 

 

$ ps -t pts/18

특정 TTY에서 실행되는 프로세스 또한 뽑아서 확인할 수 있습니다. -t 옵션을 사용해주면 돼요.

 

$ ps -e -o pid,ppid,uname,pcpu,pmem,comm,tty | head

-o 옵션을 사용하면 원하는 컬럼만 보이도록 포맷을 정할 수 있어요. 

요렇게~~

$ ps -p 1222 -o comm=

PID가 1222인 프로세스의 이름을 출력해라~

$ ps -C httpd -o pid=

이름이 httpd인 프로세스들의 pid를 출력해줘~

이런식으로도 활용이 가능합니다 ㅎㅎ

 

오늘은 이렇게 ps 명령어에 대해서 알아보았어요! ㅎㅎ

도움이 되셨다면 공감/댓글/광고보답 중 하나는 어떤가요? 다음에 또 질좋은 포스팅으로 찾아뵈도록 하겠습니당 ~

반응형