리눅스 프로세스 확인 명령어 - linugseu peuloseseu hwag-in myeonglyeong-eo

안녕하세요. 닷홈입니다.

이번 글에서는 프로세스를 확인할 때 이용하는 명령어에 대해 살펴보겠습니다.

프로세스란 현재 작동하고 있는 프로그램입니다.

서버를 운영하다 보면 작동해야 할 프로그램이 작동하지 않거나 작동하지 말아야 할 프로그램이 작동하는 경우가 있습니다.

이것을 프로세스를 확인하여 알아낼 수 있습니다.

가장 기본이 되는 명령어는 ps입니다.

process의 줄임말로 생각하실 수 있습니다.

ps는 실행 중인 프로세스의 목록을 출력해주는 명령어입니다.

ps 명령어의 기본적인 이용 방법은 아래와 같습니다.

ps [옵션]

ps 명령어의 옵션은 매우 많습니다만, 자주 사용하는 옵션에 대해 간단히 알아보겠습니다.

자세한 옵션을 모두 알고 싶으시면 man ps 하여 확인할 수 있습니다.

man 은 manual 을 보여 달라는 명령어입니다.

-l

자세한 정보 출력

-u

각 프로세서의 사용자 이름과 시작 시간을 표시

-e

모드 프로세스 표시

-a

세션 리더와 터미널과 관련되지 않은 프로세스를 제외하고 모든 프로세스를 표시

-x

로그인 상태에 있는 동안 아직 완료되지 않은 프로세스를 표시

-f

전체 형식을 표시

ps만 실행한 경우입니다. 현재 사용자가 실행한 프로세스에 대해서만 보여줍니다.

[root@letshosting ~]# ps PID TTY TIME CMD 2999 pts/0 00:00:00 bash 3072 pts/0 00:00:00 ps

-ㅣ 옵션을 주면 프로세스의 자세한 내용을 보여줍니다.

[root@letshosting ~]# ps -l F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 0 2999 2997 0 80 0 - 28860 do_wai pts/0 00:00:00 bash 0 R 0 3073 2999 0 80 0 - 38309 - pts/0 00:00:00 ps

-u 옵션을 주면 각 프로세서의 사용자 이름과 시작 시간을 보여줍니다.

[root@letshosting ~]# ps -u USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 2512 0.0 0.0 110104 868 tty1 Ss+ 10:34 0:00 /sbin/agetty --noclear tty1 linux root 2999 0.0 0.2 115440 2060 pts/0 Ss 10:35 0:00 -bash root 3090 0.0 0.1 155360 1888 pts/0 R+ 11:25 0:00 ps -u

-e 옵션을 주면 모든 프로세스를 보여줍니다.

[root@letshosting ~]# ps -e PID TTY TIME CMD 1 ? 00:00:00 systemd 2 ? 00:00:00 kthreadd 3 ? 00:00:00 ksoftirqd/0 -------------- 생략 ---------------- 3187 ? 00:00:00 sshd 3189 pts/0 00:00:00 bash 3222 pts/0 00:00:00 ps

-x 옵션은 로그인 상태에 있는 동안 아직 완료되지 않은 프로세스를 표시합니다.

[root@letshosting ~]# ps -x PID TTY STAT TIME COMMAND 1 ? Ss 0:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 22 2 ? S 0:00 [kthreadd] 3 ? S 0:00 [ksoftirqd/0] ------- 생략 ----- 3071 ? S 0:00 [kworker/0:1] 3080 ? S 0:00 [kworker/0:0] 3116 pts/0 R+ 0:00 ps -x

-f 옵션은 프로세스의 전체 형식으로 보여줍니다. 각 내용을 간단히 살펴보겠습니다.

UID : 프로세스의 사용자, User의 ID

PID : 프로세스의 고유번호, Process의 ID

PPID : PID를 생성한 부모 프로세스의 고유번호. 부모 프로세스는 pstree에서 다시 살펴보겠습니다.

C : 프로세서, CPU의 사용량을 %으로 환산한 값. 0이면 현재는 사용하고 있지 않은 상태입니다.

STIME : 프로세스가 시작된 시간

TTY : 프로세스를 시작한 터미널. 어떤 터미널에서 접속해서 그 프로세스를 실행하는지를 알려줍니다.

CMD : 말 그래도 명령어(command) 입니다.

앞으로 같은 말씀을 반복해서 드리게 될 것 같습니다만, 처음 보는 말이라 어색해서 그렇지 영어 단어로 생각해보면 어떤 내용인지 쉽게 유추할 수 있고 기억하기도 쉽습니다.

[root@letshosting ~]# ps -f UID PID PPID C STIME TTY TIME CMD root 3189 3187 0 02:42 pts/0 00:00:00 -bash root 3223 3189 0 02:59 pts/0 00:00:00 ps -f

모든 명령어가 그렇지만 이러한 옵션은 결합해서 사용할 수 있습니다.

e와 f 옵션을 같이 주면 모든 프로세스를 자세하게 보여주게 됩니다.

[root@letshosting ~]# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 0 02:39 ? 00:00:00 /usr/lib/systemd/systemd --switc root 2 0 0 02:39 ? 00:00:00 [kthreadd] root 3 2 0 02:39 ? 00:00:00 [ksoftirqd/0] ------------ 생략 --------------- root 3187 2842 0 02:42 ? 00:00:00 sshd: root@pts/0 root 3189 3187 0 02:42 pts/0 00:00:00 -bash root 3234 1 0 03:01 ? 00:00:00 /usr/sbin/anacron -s root 3237 3189 0 03:03 pts/0 00:00:00 ps -ef

아래와 같이 파이프( | )로 다른 명령어와 같이 사용해서 원하는 프로세스만 확인할 수도 있습니다.

파이프는 명령어를 서로 연결하는 기능을 합니다. grep은 파일에서 특정 패턴(문자)를 찾는 명령어입니다. 아래 명령어의 의미는 프로세스를 모두 자세하게 출력하는데 그중에서 httpd 가 들어간 내용만 보여주라는 것입니다.

[root@letshosting ~]# ps -ef | grep httpd root 2839 1 0 02:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 2893 2839 0 02:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 2896 2839 0 02:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND apache 2897 2839 0 02:40 ? 00:00:00 /usr/sbin/httpd -DFOREGROUND root 3262 3189 0 03:12 pts/0 00:00:00 grep --color=auto httpd

ps는 다양한 옵션이 있고 많이 사용하는 명령어이니 매뉴얼(man ps) 을 꼭 확인해 보셨으면 합니다.

pstree는 ps 명령어와 똑같이 프로세스 확인할 때 이용하는 명령어입니다.

그런데 프로세스의 작동은 트리 구조를 가지게 됩니다.

이러한 트리 구조를 보여주는 명령어가 pstree입니다.

pstree 명령어 문법은 아래와 같습니다.

pstree [옵션]

ps 명령어의 옵션을 간단히 알아보면 아래와 같습니다.

-a, --arguments

명령행 인수도 표시

-A, --ascii

ASCII 문자를 사용하여 표시

-c, --compact

동일한 하위 목록들을 모두 표시

-h, --highlight-all

현재 사용 중인 프로세스와 연관된 프로세스들을 강조하여 표시

-H [PID], --highlight-pid=[PID]

지정한 프로세스를 강조하여 표시

-g, --show-pgids

프로세스 그룹 ID를 표시합니다.(-c 옵션 자동 적용)

-p

PID 출력

pstree 명령어가 실행되지 않으면 설치를 해주셔야 합니다.

설치하고 옵션 없이 pstree를 실행한 것입니다.

[root@letshosting ~]# pstree -bash: pstree: command not found [root@letshosting ~]# yum -y install psmisc Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile epel/x86_64/metalink | 6.7 kB 00:00 ---------------- 생략 ----------------------- Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: psmisc x86_64 22.20-15.el7 base 141 k Transaction Summary ================================================================================ Install 1 Package ---------------- 생략 ----------------------- Installed: psmisc.x86_64 0:22.20-15.el7 Complete! [root@letshosting ~]# pstree systemd─┬─NetworkManager─┬─dhclient │ └─2*[{NetworkManager}] ├─auditd───{auditd} ├─chronyd ├─crond ├─dbus-daemon ├─httpd───10*[httpd] ├─login───bash ├─lvmetad ├─master─┬─pickup │ └─qmgr ├─mysqld───36*[{mysqld}] ├─polkitd───6*[{polkitd}] ├─proftpd ├─rsyslogd───2*[{rsyslogd}] ├─sshd───sshd───bash───pstree ├─systemd-journal ├─systemd-logind ├─systemd-udevd └─tuned───4*[{tuned}]

위의 옵션 들 중 자주 사용하는 옵션은 hp 옵션입니다.

현재 사용 중인 프로세스와 연관된 프로세스들을 강조하여 표시하며, PID까지 같이 출력됩니다.

[root@letshosting ~]# pstree -hp systemd(1)─┬─NetworkManager(2545)─┬─dhclient(2616) │ ├─{NetworkManager}(2593) │ └─{NetworkManager}(2595) ├─auditd(2505)───{auditd}(2506) ├─chronyd(2578) ├─crond(2577) ├─dbus-daemon(2528) ├─httpd(2839)─┬─httpd(2893) │ ├─httpd(2895) │ ├─httpd(2896) ---------------- 생략 ----------------------- │ └─httpd(3315) ├─login(2587)───bash(3169) ├─lvmetad(1401) ├─master(3108)─┬─pickup(6889) │ └─qmgr(3120) ├─mysqld(2882)─┬─{mysqld}(3085) │ ├─{mysqld}(3086) │ ├─{mysqld}(3087) │ ├─{mysqld}(3088) ---------------- 생략 ----------------------- │ ├─{mysqld}(3159) │ ├─{mysqld}(3160) │ ├─{mysqld}(3161) │ └─{mysqld}(3162) ├─polkitd(2543)─┬─{polkitd}(2580) │ ├─{polkitd}(2582) │ └─{polkitd}(2591) ├─proftpd(2876) ├─rsyslogd(2843)─┬─{rsyslogd}(2854) │ └─{rsyslogd}(2856) ├─sshd(2842)───sshd(3187)───bash(3189)───pstree(6890) ├─systemd-journal(1381) ├─systemd-logind(2526) ├─systemd-udevd(1409) └─tuned(2838)─┬─{tuned}(3117) ├─{tuned}(3118) ├─{tuned}(3121) └─{tuned}(3141)

프로세스가 트리 구조로 되어 있고 PPID(Parent PID) 가 PID를 생성한다는 것을 이론적으로 설명하기는 좀 어렵습니다. httpd는 웹서버인 아파치 프로세스인데 이것으로 단순하게 예를 들어 설명해보겠습니다. 아파치를 시작하면 프로세스가 하나 시작되고 111번 고유번호(PID)를 부여받습니다.

그런데 웹서버는 홈페이지에 접속이 많으면 그에 따라 프로세스가 많아지게 됩니다.

그렇게 많아지는 프로세스들이 1121, 1122 고유번호를 부여받고 1번 프로세스의 하위 프로세스, 자식 프로세스가 됩니다.

위의 예에서는 잘 보이지 않지만 h 옵션을 주었기 때문에 강조돼서 표시되는 현재 사용 중인 sshd(2842)── sshd(3187)── bash(3189)── pstree(6890) 프로세스 관계로 설명을 다시 해보면 ssh 프로그램이 처음 시작되었을 때 2842 id를 부여받은 프로세스가 실행되었고, 이 테스트 서버에 ssh 접속을 하였으니 3187 이라는 자식 프로세스가 태어났습니다.

ssh로 접속한 사용자가 명령어를 실행해야 하니 bash 쉘이 시작되어 3189 프로세스가 생겨났고 pstree 명령어를 실행해서 6890 프로세스가 탄생했습니다.

bash 쉘은 사용자가 입력한 명령어를 컴퓨터가 알아듣게 전달하는 명령어 해석기입니다.

pstree는 ps 보다 한눈에 프로세스의 작동 상태를 보여주기 때문에 자주 사용이 됩니다.

pstree로 전체 상태를 확인하고 자세히 알고 싶을 때는 ps에 여러 옵션을 주어서 알아볼 수 있습니다.

하나의 PID를 자세히 확인할 때는 다음에 설명할 lsof를 사용하기도 합니다.

lsof(list open file) 명령어는 사용 중인 파일들의 목록과 함께 해당 파일의 소유자, 관련 프로세스, 크기, 타입 등의 정보를 출력해주는 명령어입니다.

그런데 여기서 파일이라고 하는 개념이 엑셀 파일, 음악 파일이라고 하는 파일과는 다릅니다.

리눅스나 유닉스에서 일반 파일뿐만 아니라 디렉터리, 소켓, 라이브러리, 장치, 파이프 등 모든 것이 파일로 처리됩니다.

모든 것이 파일로 처리되기 때문에 파일의 정보를 안다는 것이 중요하게 됩니다.

lsof 명령어 문법은 아래와 같습니다.

lsof [옵션] [파일명|프로세스명|PID]

lsof의 옵션도 상당히 많습니다만, 간단히 알아보겠습니다.

-i

네트워크 연결되어 있는 프로세스의 파일 정보 출력

-a

여러 옵션을 사용할 때 AND 연산으로 파일 정보 출력

-u

특정 사용자와 관련된 프로세스의 파일 정보 출력

-c

특정 명령어를 사용하고 있는 정보 출력

-t

현재 동작하고 있는 프로세스의 PID를 출력

-T

TCP로 통신하는 소켓만 출력

-p <PID>

지정한 프로세스와 관련된 프로세스의 파일 정보 출력

lsof 명령어도 설치되어 있지 않으면 아래와 같이 설치를 하여야 합니다. lsof만 입력하면 모든 열린 파일을 보여줍니다.

[root@letshosting ~]# lsof -bash: lsof: command not found [root@letshosting ~]# yum -y install lsof Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile ------------------ 생략 ----------------- Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: lsof x86_64 4.87-6.el7 base 331 k Transaction Summary ================================================================================ Install 1 Package ------------------ 생략 ----------------- Installed: lsof.x86_64 0:4.87-6.el7 Complete! [root@letshosting ~]# lsof COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,0 224 64 / systemd 1 root rtd DIR 253,0 224 64 / systemd 1 root txt REG 253,0 1616360 12750489 /usr/lib/systemd/systemd ------------------ 이하 생략 -----------------

-i 옵션으로 네크워크와 연결된 프로세스의 파일 정보를 알 수 있습니다.

[root@letshosting ~]# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME chronyd 2578 chrony 1u IPv4 20676 0t0 UDP localhost:323 chronyd 2578 chrony 2u IPv6 20677 0t0 UDP localhost:323 dhclient 2616 root 6u IPv4 21703 0t0 UDP *:bootpc sshd 2842 root 3u IPv4 22864 0t0 TCP *:njenet-ssl (LISTEN) sshd 2842 root 4u IPv6 22873 0t0 TCP *:njenet-ssl (LISTEN) proftpd 2876 nobody 0u IPv6 23057 0t0 TCP *:ftp (LISTEN) mysqld 2882 mysql 30u IPv6 23899 0t0 TCP *:mysql (LISTEN) mysqld 2882 mysql 33u IPv6 24034 0t0 TCP *:33060 (LISTEN) master 3108 root 13u IPv4 23696 0t0 TCP localhost:smtp (LISTEN) master 3108 root 14u IPv6 23697 0t0 TCP localhost:smtp (LISTEN) sshd 3187 root 3u IPv4 24332 0t0 TCP localhost.localdomain:njenet-ssl->192.168.0.71:57154 (ESTABLISHED) httpd 6935 root 4u IPv6 32032 0t0 TCP *:http (LISTEN) httpd 6935 root 6u IPv6 32040 0t0 TCP *:https (LISTEN) ------------------ 이하 생략 -----------------

-p 옵션으로 특정 PID에 관련된 파일 정보를 알 수 있습니다.

httpd 프로세스에 대한 것인데 실제 해보시면 생략된 부분이 매우 많은 것을 아실 수 있습니다.

모든 것이 파일이기 때문에 보이는 정보도 많은 것입니다.

[root@letshosting ~]# lsof -p 6935 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME httpd 6935 root cwd DIR 253,0 224 64 / httpd 6935 root rtd DIR 253,0 224 64 / httpd 6935 root txt REG 253,0 523672 121848 /usr/sbin/httpd httpd 6935 root mem REG 253,0 61624 14446 /usr/lib64/libnss_files-2.17.so httpd 6935 root mem REG 253,0 27808 12699225 /usr/lib64/httpd/modules/mod_cgi.so httpd 6935 root mem REG 253,0 68192 31774 /usr/lib64/libbz2.so.1.0.6 httpd 6935 root mem REG 253,0 157424 31766 /usr/lib64/liblzma.so.5.2.2 ------------------ 생략 ----------------- httpd 6935 root 9w REG 253,0 0 121974 /var/log/httpd/ssl_error_log httpd 6935 root 10w REG 253,0 34217 121975 /var/log/httpd/access_log httpd 6935 root 11w REG 253,0 0 121976 /var/log/httpd/ssl_access_log httpd 6935 root 12w REG 253,0 0 121977 /var/log/httpd/ssl_request_log

실행 결과 상단의 각각의 항목의 내용을 간단히 살펴보겠습니다.

COMMAND : 해당 프로세스를 실행한 명령어

PID : 프로세스 id

USER : 사용자

FD : 파일 디스크립터(File Descriptor), 모든 것이 파일인 리눅스에서 파일을 대표하는 어떤 값이라고 이해하실 수 있습니다.

- cwd : 현재 작업 중인 디렉터리

- rtd : 루트 디렉터리

- txt : 텍스트 파일

- mem : 메모리에 매핑된 파일

- mmap : 메모리에 매핑된 장치

TYPE : 파일의 타입

- DIR : 디렉터리

- REG : 일반 파일

DEVICD : 장치 번호

SIZE/OFF : 파일 크기, 오프셋

NODE : 노드 번호

NAME : 파일명

각 항목의 내용을 모두 자세히 설명드리지 못하였지만 각 항목이 어떤 의미인지를 알아야 lsof의 결과에서 어떤 사용자가 어떤 명령어로 어떤 파일을 열어보았는지를 알 수 있습니다.

lsof로 어떤 프로세스, 어떤 사용자가 어떤 파일을 사용하는지를 알 수 있기 때문에 문제가 되는 프로세스를 찾는 등 장애 대응에도 이용하실 수 있으니 꼭 활용해보시기 바랍니다.

오늘은 프로세스를 확인하는 세 가지 명령어에 대해서 알아보았습니다.

각각의 명령어를 어떤 상황에서 이용하는지 다양한 옵션을 실제 적용하시면서 공부하시고 또 활용해보시면 좋을 듯합니다.

감사합니다. 좋은하루 되세요:)

리눅스 프로세스 확인 명령어 - linugseu peuloseseu hwag-in myeonglyeong-eo