[Linux] ps 로 실행 중인 프로세스 확인하기
개요
ps 명령어는 리눅스에서 현재 실행중인 프로세스를 확인하는 명령어 입니다.
Process Status에서 따온 이름이죠. 이름 그대로 명령어를 실행하면 현재 실행되고 있는 프로세스들의 정보를 화면에 출력합니다.
윈도우에서 특정 프로세스가 실행 중인지 확인하거나 강제 종료하기 위해 작업 관리자를 사용하듯이 리눅스에서는 ps 명령어가 자주 사용됩니다.
특히 GUI를 사용하지 않는 서버 환경에서는 대부분의 프로세스들이 백그라운드에서 동작하기 때문에 특정 프로세스가 동작 중인지 확인하기 위해서 많이 쓰입니다.
bash 스크립트(script)를 통한 자동화에도 ps 명령어가 자주 사용되는데요.
주로 특정 프로세스에 시그널(signal)을 보내야 할 때 PID(process id)를 식별하기 위해서 쓰이기도 하고, 프로세스가 중단되면 다시 실행시키기 위해 감시하는 목적으로 쓰이기도 합니다.
사용법
ps --help all
shell에서 위와 같이 help 명령어를 실행하면 ps 명령어에 대한 자세한 도움말을 볼 수 있습니다.
Usage:
ps [options]
Basic options:
-A, -e all processes
-a all with tty, except session leaders
a all with tty, including other users
-d all except session leaders
-N, --deselect negate selection
r only running processes
T all processes on this terminal
x processes without controlling ttys
Selection by list:
-C <command> command name
-G, --Group <GID> real group id or name
-g, --group <group> session or effective group name
-p, p, --pid <PID> process id
--ppid <PID> parent process id
-q, q, --quick-pid <PID>
process id (quick mode)
-s, --sid <session> session id
-t, t, --tty <tty> terminal
-u, U, --user <UID> effective user id or name
-U, --User <UID> real user id or name
The selection options take as their argument either:
a comma-separated list e.g. '-u root,nobody' or
a blank-separated list e.g. '-p 123 4567'
Output formats:
-F extra full
-f full-format, including command lines
f, --forest ascii art process tree
-H show process hierarchy
-j jobs format
j BSD job control format
-l long format
l BSD long format
-M, Z add security data (for SELinux)
-O <format> preloaded with default columns
O <format> as -O, with BSD personality
-o, o, --format <format>
user-defined format
s signal format
u user-oriented format
v virtual memory format
X register format
-y do not show flags, show rss vs. addr (used with -l)
--context display security context (for SELinux)
--headers repeat header lines, one per page
--no-headers do not print header at all
--cols, --columns, --width <num>
set screen width
--rows, --lines <num>
set screen height
Show threads:
H as if they were processes
-L possibly with LWP and NLWP columns
-m, m after processes
-T possibly with SPID column
Miscellaneous options:
-c show scheduling class with -l option
c show true command name
e show the environment after command
k, --sort specify sort order as: [+|-]key[,[+|-]key[,...]]
L show format specifiers
n display numeric uid and wchan
S, --cumulative include some dead child process data
-y do not show flags, show rss (only with -l)
-V, V, --version display version information and exit
-w, w unlimited output width
--help <simple|list|output|threads|misc|all>
display help and exit
가장 흔하게 사용되는 옵션은 -e 와 -f 옵션입니다.
-e 옵션은 전체 프로세스를 보겠다는 옵션인데 이 옵션을 사용하지 않으면 현재 로그인된 shell에서 실행 중인 프로세스만 표시되기 때문에 대부분의 경우 -e 옵션을 사용합니다.
-A 로도 동일하게 사용 가능하지만 대문자 A보다는 소문자 e가 사용하기 좀 더 편합니다.
[root@peterdev ~]# ps
PID TTY TIME CMD
756 pts/0 00:00:00 ps
23316 pts/0 00:00:01 bash
28992 pts/0 00:00:00 bash
[root@peterdev ~]# ps -e
PID TTY TIME CMD
1 ? 01:16:34 systemd
2 ? 00:00:14 kthreadd
3 ? 00:01:10 ksoftirqd/0
5 ? 00:00:00 kworker/0:0H
7 ? 00:00:00 migration/0
8 ? 00:00:00 rcu_bh
...
...
...
4982 ? 00:02:04 python
31680 ? 00:01:10 qmgr
32662 ? 00:00:00 pickup
-f 옵션은 프로세스의 상태 정보를 모두(full) 표시하겠다는 옵션입니다.
[root@peterdev ~]# ps -f
UID PID PPID C STIME TTY TIME CMD
root 773 28992 0 15:51 pts/0 00:00:00 ps -f
root 23316 23302 0 2018 pts/0 00:00:01 /bin/bash
root 28992 28988 0 08:25 pts/0 00:00:00 -bash
프로세스를 실행한 UID와 PID, 그리고 부모 프로세스의 ID(PPID)도 표시되며, 프로세스를 실행할 당시의 커맨드라인(command-line)도 표시 되기 때문에 자주 사용됩니다.
같은 이름의 프로세스가 여러 개 실행 중일 때는 커맨드 라인으로 프로세스를 구분해야 하기 때문입니다. (nginx 같은 경우)
여러 개의 옵션을 함께 사용할 때는 - 기호는 한번만 써도 됩니다.
[root@peterdev ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 2018 ? 01:16:34 /usr/lib/systemd/systemd --system --deserialize 21
root 2 0 0 2018 ? 00:00:14 [kthreadd]
root 3 2 0 2018 ? 00:01:10 [ksoftirqd/0]
root 5 2 0 2018 ? 00:00:00 [kworker/0:0H]
root 7 2 0 2018 ? 00:00:00 [migration/0]
-u 옵션을 사용하면 특정 사용자 계정(UID)으로 실행되고 있는 프로세스만 볼 수 있습니다.
[root@localhost ~]# ps -fu node_manager
UID PID PPID C STIME TTY TIME CMD
node_ma+ 183483 1 0 8월04 ? 00:09:22 java -jar -Xms2048m -Xmx2048m -XX:PermSize=256m -XX:MaxPermSize=512m node_manager-0.0.1-SNAP
node_ma+ 199085 199067 0 8월03 ? 00:00:00 sshd: node_manager@pts/3
node_ma+ 199086 199085 0 8월03 pts/3 00:00:00 -bash
예제
ps -ef 명령어를 실행해보시면 아시겠지만 결과가 굉장히 많이 출력됩니다.
당연하게도 전체 프로세스 정보를 출력하는 것이니 많을 수밖에요. 이렇다 보니 내가 확인하려고 하는 프로세스를 찾기 위해서는 뭔가 방법이 필요해 보입니다.
이전 포스팅에서 파이프(pipe)에 대해서 설명드린 적이 있는데요, 바로 지금이 파이프를 활용할 때입니다.
만일 내가 찾고자 하는 프로세스 이름에 python 이라는 문자열이 들어간다고 하면 아래와 같이 찾을 수 있습니다.
[root@peterdev ~]# ps -ef | grep python
root 477 1 0 2018 ? 00:00:47 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
root 819 1 0 2018 ? 03:10:37 /usr/bin/python -Es /usr/sbin/tuned -l -P
root 847 28992 0 16:01 pts/0 00:00:00 grep --color=auto python
root 4982 4956 0 2019 ? 00:02:04 python ./get_pr.py
root 28692 1 0 2019 ? 00:00:00 python app.py
이처럼 python 프로세스가 여러 개 실행 중인걸 확인 할 수 있는데요, 커맨드라인을 통해 어떤 스크립트를 실행하고 있는지 구별이 가능합니다.
-Peter의 우아한 프로그래밍
여러분의 공감과 댓글은 저에게 크나큰 힘이 됩니다. 오류 및 의견 주시면 감사하겠습니다.