본문 바로가기

Linux/Commands Part

ps

ps

현재 실행되고 있는 프로세스의 목록을 보여준다. 주로 서버의 상태를 파악하기 위하여 프로세스의 상태를 관리자가 파악할 때에 사용하는 명령어이다. 가장 흔하게 실행하는 명령어 가운데 하나이며, 서버관리에 없어서는 안될 매우 중요한 명령어이다.
<명령어 위치> : /bin/ps
<사용법>
ps [옵션]
<옵션>
-l(소문자 엘) : 자세한 형태의 정보를 출력한다.
-u : 각 프로세스의 사용자 이름과 시작 시간을 보여준다.
-j : 작업 중심 형태로 출력한다.
-s : 시그널 중심 형태로 출력한다.
-v : 가상 메모리 중심 형태로 출력한다.
-m : 메모리 정보를 출력한다.
-a : 다른 사용자들의 프로세스도 보여준다.
-x : 로그인 상태에 있는 동안 완료되지 않은 프로세스들을 보여준다. 유닉스 시스템은 사용자가 로그아웃하고 난 후에도 임의의 프로세스가 계속 동작하게 할 수 있다. 그러면 그 프로세스는 자신을 실행시킨 쉘이 없이도 계속 자신의 일을 수행한다. 이러한 프로세스는 일반적인 ps 명령으로 확인할 수 없다. 이때 –x 옵션을 사용하면 자신의 터미널이 없는 프로세스들을 확인할 수 있다.
-S : 챠일드(child) CPU 시간과 메모리 페이지 결함(fault) 정보를 추가한다.
-c : 커널 task_structure로부터 명령 이름을 보여준다.
-e : 환경을 보여준다.
-w : 긴(wide) 형태로 출력한다. 한행 안에 출력이 잘리지 않는다.
-h : 헤더를 출력하지 않는다.
-n : USER와 WCHAIN을 위해 수치 출력을 지원한다.
다음은 ps –ef를 실행한 화면이다.
명령 출력의 각 필드의 의미는 다음과 같다.
USER : 프로세스 소유자의 계정을 보여준다.
PID : 프로세스를 구분하기 위한 고유의 ID
RSS : 프로세스에 의해 사용되는 실제 메모리의 용량(Kbyte 단위)
SZ : 프로세스의 자료와 스택의 크기(Kbyte 단위)
TIME : 현재까지 사용된 CPU의 시간(분, 초)
TTY : 프로세스의 제어 터미널(t3=/dev/tty3) // ? 로 나오는 것은 부팅되면서 자동으로 실행되는 프로세스이다.
%CPU : 마지막 분 동안 프로세스가 사용한 CPU 시간의 백분율
%MEM : 마지막 분 동안 프로세스가 사용한 메모리양의 백분율
START : 프로세스가 시작된 시간
STAT : 프로세스의 상태
COMMAND : 명령어의 이름
위에서 STAT는 몇 가지 부호를 사용해서 프로세스의 상태를 표시하고 있는데, 아래와 같은 의미이다.(뒤의 top 이라는 명령어에서 다시 나온다!)
P : 수행가능/수행중
T : 일시 정지
D : 디스크 입출력 대기 같은 인터럽트 할 수 없는 대기상태
S : 20초 미만의 짧은 휴식상태(sleep)
I(대문자 아이) : 20초 이상의 긴 휴식 상태
Z : 좀비(zombi) 프로세스
아래 그냥 ps를 쳐보자.
[root@localhost /]# cd /
[root@localhost /]# ps
PID TTY TIME CMD
8628 pts/2 00:00:00 bash
8744 pts/2 00:00:00 ps
위의 결과를 보면 현재 ps를 실행시킨 사용자는 bash 쉘 사용중에 ps를 실행시켰다는 것을 알 수 있다. ps 명령어를 사용할 때 가장 흔히 사용하는 옵션이 –e 와 –f 옵션인데, 우리는 위의 옵션중에 하나인 –w 옵션을 이용해서 긴(wide) 형태로 출력해보자.
[root@localhost /]# ps –efw
..중간 생략..
root 7912 1 0 12:37 ? 00:00:00 /usr/sbin/sshd
root 7923 1 0 12:37 ? 00:00:00 cupsd
root 7943 1 0 12:37 ? 00:00:00 sendmail: accepting connections
smmsp 7951 1 0 12:37 ? 00:00:00 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue
root 7963 1 0 12:37 ? 00:00:00 gpm -m /dev/input/mice -t exps2
root 7974 1 0 12:37 ? 00:00:00 crond
..이하 생략..
◆ 특정 프로세스가 실행되어있는가 확인하기
특정 프로세스의 실행 상태를 정확하게 확인하고자 한다면 ps 명령어에서 필요한 프로세스명을 지정하여 그에 해당하는 프로세스만을 확인하면 된다.
<사용형식>
ps –ef | grep 확인하고자하는프로세스명
즉, 특정 프로세스가 현재 실행중인가를 확인하고자 한다면 위의 형식을 사용하면 된다.
(예) 모든 프로세스 중에서 tty 관련된 프로세스만을 표시해 준다는 의미이다.
[root@localhost /]# ps -ef | grep tty
root 8170 1 0 12:37 tty1 00:00:00 /sbin/mingetty tty1
root 8171 1 0 12:37 tty2 00:00:00 /sbin/mingetty tty2
root 8172 1 0 12:37 tty3 00:00:00 /sbin/mingetty tty3
root 8173 1 0 12:37 tty4 00:00:00 /sbin/mingetty tty4
root 8174 1 0 12:37 tty5 00:00:00 /sbin/mingetty tty5
root 8203 1 0 12:37 tty6 00:00:00 /sbin/mingetty tty6
root 8282 8277 2 12:38 tty7 00:00:26 /usr/bin/Xorg :0 -br -audit 0 -auth /var/gdm/:0.Xauth -nolisten tcp vt7
root 8756 8628 0 12:59 pts/2 00:00:00 grep tty
(예) ssh에 관련된 프로세스만을 표시해주는 예를 한번 더 해보자.
[root@localhost /]# ps -ef | grep ssh
root 7912 1 0 12:37 ? 00:00:00 /usr/sbin/sshd
root 8331 8299 0 12:38 ? 00:00:00 /usr/bin/ssh-agent /bin/sh -c exec -l /bin/bash -c "/usr/bin/dbus-launch --exit-with-session /etc/X11/xinit/Xclients"
root 8626 7912 0 12:39 ? 00:00:02 sshd: root@pts/2
root 8760 8628 0 13:00 pts/2 00:00:00 grep ssh
다음은 실무에서 많이 사용하는 예를 해보겠다. httpd 에 관련된 프로세스를 확인하고자 할 때에는 아래와 같이 하면 된다.
[root@localhost /]# ps -ef | grep httpd
root 8765 8628 0 13:01 pts/2 00:00:00 grep httpd
왜 안타날까???
[root@localhost /]# ps -ef | grep tty | wc -l
8
wc –l(소문자 엘)의 명령어를 이용한 것인데, 프로세스 갯수가 몇개나 되는가를 확인하려면 위와 같이 하면 된다.

 

 

<PS 명령어의 상세설명>

1.기능

유닉스는 동시에 여러 개의 프로세서가 동작되기 때문에 사용자가 그것들의 목록과
상태를 점검할 필요가 있다.
ps라는 이름은 processor status를 의미한다. ps를 사용하여 프로세서들의 상태를
점검할 수 있다.


2. 문법

# ps [ 옵션 ]


3. 옵션

-l : 자세한 형태의 정보를 출력한다.
-u : 각 프로세서의 사용자 이름과 시작 시간을 보여준다.
-j : 작업 중심 형태로 출력한다.
-s : 시그널 중심 형태로 출력한다.
-v : 가상 메모리 중심 형태로 출력한다.
-m : 메모리 정보를 출력한다.
-a : 다른 사용자들의 프로세서도 보여준다.
-x : 로그인 상태에 있는 동안 아직 완료되지 않은 프로세서들을 보여준다.
유닉스 시스템은 사용자가 로그아웃하고 난 후에도 임의의 프로세서가 계속 동작하게 할 수 있다. 그러면 그 프로세서는 자신을 실행

시킨 셸이 없이도 계속 자신의 일을
수행한다. 이러한 프로세서는 일반적인 ps 명령으로 확인할 수 없다. 이때 -x 옵션을
사용하면 자신의 터미널이 없는 프로세서들을 확인할 수 있다.
-S : 차일드(child) CPU 시간과 메모리 페이지 결함(fault) 정보를 추가 한다.
-c : 커널 task_structure로 부터 명령 이름을 보여준다.
-e : 환경을 보여준다.
-w : 긴(wide) 형태로 출력한다. 한 행 안에 출력이 잘리지 않는다.
-h : 헤더를 출력하지 않는다.
-r : 현재 실행중인 프로세서를 보여준다.
-n : USER 와 WCHAN 을 위해 수치 출력을 지원한다.


4. 사용방법 및 정보

가) 기본적으로 ps는 현재 명령이 내려지는 쉘에서 만들어진 프로세서들의 목록만을
보여준다.
ps는 자신이 실행되는 당시, 현재의 쉘에 의해서 수행된 프로세서들을 검사하고
보고한다는 점을 생각하자.
그러면 ps의 출력결과 리스트에 ps 자신이 있는 이유를 쉽게 이해할 수 있을 것이다.
각 필드의 의미는 다음과 같다.


COMMAND : 명령어의 이름
PID : 프로세서 ID, 각 프로세서를 구분하기 위한 고유의 ID
RSS : 프로세서에 의해 사용되는 실제 메모리의 용량(K byte 단위)
USER : 프로세서를 실행시킨 소유자의 계정을 보여준다.
SZ : 프로세서의 자료와 스텍 크기의 (K byte 단위)
TIME : 현재까지 사용된 CPU의 시간(분,초)
TT : 프로세서의 제어 터미널(t3=/dev/tty3)
%CPU : 마지막 분동안 프로세서가 사용한 CPU시간의 백분율
START : 프로세서가 시작된 시간
STAT : 프로세서의 상태

이 중 STAT 필드는 몇 가지의 부호를 사용해서 프로세서의 상태를 표시하고 있다.
그것들을 정리해 보면 다음과 같다.

P : 수행 가능/수행 중
T : 일시 정지
D : 디스크 입출력 대기 같은 인터럽트할 수 없는 대기상태
S : 20초 미만의 짧게 잠듦(sleep)
I : 20초 이상의 길게 잠듦
Z : 좀비(zombi) 프로세서
R : CPU 대기/실행중
W : 모두 swap되어 있다.
< : 우선도가 높다.
N : 우선도가 낮다.
L : 특별한 프로세스

Here are the different values that the s, stat and state output specifiers
(header "STAT" or "S") will display to describe the state of a process.
D Uninterruptible sleep (usually IO)
R Running or runnable (on run queue)
S Interruptible sleep (waiting for an event to complete)
T Stopped, either by a job control signal or because it is being traced.
W paging (not valid since the 2.6.xx kernel)
X dead (should never be seen)
Z Defunct ("zombie") process, terminated but not reaped by its parent.

For BSD formats and when the stat keyword is used, additional characters may
be displayed:
< high-priority (not nice to other users)
N low-priority (nice to other users)
L has pages locked into memory (for real-time and custom IO)
s is a session leader
l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)
+ is in the foreground process group

좀비(zomb) 상태라는 것은 프로세서가 사라질 때 시그널 처리의 문제로 완전히
소멸되지 못한 상태를 말한다.

대개는 _aux 옵션을 많이 사용한다. 이 중 필요한 프로세스에 대한 결과만 선택적으로
보고자 한다면 grep 명령을 같이 사용한다.


무한루프 작업만들기
[root@localhost /]# yes > /dev/null
[2]+ Stopped yes > /dev/null [Crtl+Z한것임]

[root@localhost /]# bg
[2]+ yes > /dev/null &

[root@localhost /]# jobs
[2]+ Running yes > /dev/null &

[root@localhost /]# find / -name "startx" &
[3] 18126
[root@localhost /]# /usr/bin/startx

[3]+ Done find / -name "startx"
[root@localhost /]# jobs
[2]+ Running yes > /dev/null &

백그라운드를 포그라운드로 불러내기
[root@localhost /]# fg %2
yes > /dev/null [Ctrl+c 를 눌러 취소하기]