pstree 명령어: 프로세스 트리 보기와 -p, -a, -s 옵션

pstree 명령어는 실행 중인 프로세스를 부모와 자식 관계에 따라 트리로 출력하는 리눅스 명령어입니다. Debian 12 서버의 셸 하나에 프로세스 일곱 개와 스레드 셋을 띄워 옵션을 바꿔 실행한 결과, -p로 PID를 붙이고 -s로 위쪽 부모 프로세스까지 펼쳐 어느 프로세스가 무엇을 실행했는지 한 화면에서 확인하게 되었습니다.
아래 출력은 모두 Debian 12 테스트 서버의 일반 계정에서 psmisc 23.6의 pstree로 실행한 결과입니다. 서버 전체 트리 대신 실습 셸의 PID를 지정해 그 아래 트리만 출력했고, 계정 이름(user)과 실습 프로세스 이름은 예시 값으로 바꿨습니다.
1️⃣ pstree 사용법과 트리 읽는 법
기본 꼴은 [pstree 옵션 PID]입니다. PID를 적지 않으면 systemd를 뿌리로 서버 전체를 출력하고, PID 자리에 사용자 이름을 적으면 그 사용자가 소유한 프로세스를 뿌리로 하는 트리를 출력합니다.
실습은 sleep을 xxsleep-a, xxsleep-b라는 이름으로 복사해 두고, 아래 명령을 담은 pstree-lab.sh를 bash로 실행해 그 셸 아래에 프로세스를 띄운 상태에서 진행했습니다.
set -m
cd /tmp/xxpst
./xxsleep-a 40 &
./xxsleep-b 40 & ./xxsleep-b 40 & ./xxsleep-b 40 &
bash -c './xxsleep-a 40 & wait' &
python3 xxthread.py &마지막 줄의 xxthread.py는 40초 동안 대기하는 스레드 셋을 만드는 파이썬 코드입니다.
import threading, time
for _ in range(3):
threading.Thread(target=time.sleep, args=(40,)).start()[$$]에는 지금 셸의 PID가 들어 있어, 아래 명령은 실습 셸을 뿌리로 그 아래 프로세스를 출력합니다.
pstree $$bash─┬─bash───xxsleep-a
├─pstree
├─python3───3*[{python3}]
├─xxsleep-a
└─3*[xxsleep-b]자식이 하나뿐이면 ───로 바로 붙고, 둘 이상이면 ─┬─에서 나뉘어 ├─와 └─로 이어집니다. 이름이 같은 형제 xxsleep-b 세 개는 [3*[xxsleep-b]]처럼 개수와 함께 한 줄로 합쳐졌고, 중괄호로 감싼 [{python3}]은 python3 프로세스 안의 스레드입니다.
pstree 자신도 실습 셸이 실행한 자식이라 트리에 함께 나왔습니다.
pstree -p $$bash(1426809)─┬─bash(1426815)───xxsleep-a(1426818)
├─pstree(1426823)
├─python3(1426816)─┬─{python3}(1426819)
│ ├─{python3}(1426820)
│ └─{python3}(1426821)
├─xxsleep-a(1426811)
├─xxsleep-b(1426812)
├─xxsleep-b(1426813)
└─xxsleep-b(1426814)-p를 붙이면 이름 뒤 괄호에 PID가 붙고, 합쳐 있던 xxsleep-b 세 개와 스레드 셋이 PID별로 한 줄씩 펼쳐집니다. 공식 매뉴얼도 -p는 합치기를 끈다고 설명합니다.
특정 프로세스 아래만 보려면 그 PID를 적습니다. 마지막으로 백그라운드에서 실행한 프로세스의 PID는 [$!]에 들어 있어, python3 프로세스와 스레드 셋만 출력되었습니다.
pstree -p $!python3(1426816)─┬─{python3}(1426819)
├─{python3}(1426820)
└─{python3}(1426821)2️⃣ pstree 명령어 옵션
옵션은 pstree 바로 뒤, PID 앞에 적으며 여러 개를 함께 적을 수 있습니다. 아래 출력은 모두 같은 실습 셸에서 실행한 결과입니다.
-c는 같은 이름을 합치지 않고 프로세스와 스레드를 한 줄씩 출력합니다. PID 없이 프로세스 수만 세어 볼 때 사용합니다.
pstree -c $$bash─┬─bash───xxsleep-a
├─pstree
├─python3─┬─{python3}
│ ├─{python3}
│ └─{python3}
├─xxsleep-a
├─xxsleep-b
├─xxsleep-b
└─xxsleep-b-a는 프로세스마다 실행할 때 적은 명령줄 인자까지 출력합니다. 맨 위 줄 [bash pstree-lab.sh]는 실습 명령을 담은 스크립트를 실행한 셸입니다.
pstree -a $$bash pstree-lab.sh
├─bash -c ./xxsleep-a 40 & wait
│ └─xxsleep-a 40
├─pstree -a 1426809
├─python3 xxthread.py
│ └─3*[{python3}]
├─xxsleep-a 40
├─xxsleep-b 40
├─xxsleep-b 40
└─xxsleep-b 40xxsleep-b 세 개는 각각 [xxsleep-b 40]으로 나와 합쳐지지 않았고, 스레드는 [3*[{python3}]]으로 합쳐진 채 남았습니다. 공식 매뉴얼은 -a가 프로세스의 합치기만 끄고 스레드는 그대로 둔다고 설명합니다.
기본 정렬은 이름순이며, -n은 같은 부모 아래의 프로세스를 PID 순으로 정렬합니다. 실습 스크립트에 적은 순서대로 xxsleep-a부터 python3까지 차례로 나왔습니다.
pstree -n -p $$bash(1426809)─┬─xxsleep-a(1426811)
├─xxsleep-b(1426812)
├─xxsleep-b(1426813)
├─xxsleep-b(1426814)
├─bash(1426815)───xxsleep-a(1426818)
├─python3(1426816)─┬─{python3}(1426819)
│ ├─{python3}(1426820)
│ └─{python3}(1426821)
└─pstree(1426826)-s는 지정한 프로세스의 위쪽 부모를 systemd까지 함께 출력합니다. 실습 셸 위로 sshd가 세 단계 이어진 것은 SSH로 접속한 세션 안에서 스크립트를 실행했기 때문입니다.
pstree -s $$systemd───sshd───sshd───sshd───bash─┬─bash───xxsleep-a
├─pstree
├─python3───3*[{python3}]
├─xxsleep-a
└─3*[xxsleep-b]-u는 부모와 소유자가 달라지는 자리에 바뀐 사용자 이름을 붙입니다. root로 실행되던 sshd가 접속한 계정의 sshd로 넘어가는 자리에 [(user)]가 붙었고, 그 아래는 같은 계정이라 붙지 않았습니다.
pstree -u -s $$systemd───sshd───sshd───sshd(user)───bash─┬─bash───xxsleep-a
├─pstree
├─python3───3*[{python3}]
├─xxsleep-a
└─3*[xxsleep-b]-g는 프로세스 그룹 ID(PGID)를 출력하며, -p와 함께 쓰면 [(PID,PGID)] 꼴로 나옵니다. 실습 스크립트는 첫 줄 set -m으로 작업 제어를 켠 상태라 백그라운드 작업마다 PGID가 따로 붙었습니다.
pstree -p -g $$bash(1426809,1426809)─┬─bash(1426815,1426815)───xxsleep-a(1426818,1426815)
├─pstree(1426829,1426829)
├─python3(1426816,1426816)─┬─{python3}(1426819,1426816)
│ ├─{python3}(1426820,1426816)
│ └─{python3}(1426821,1426816)
├─xxsleep-a(1426811,1426811)
├─xxsleep-b(1426812,1426812)
├─xxsleep-b(1426813,1426813)
└─xxsleep-b(1426814,1426814)bash -c 안에서 실행한 xxsleep-a는 같은 작업에 속해 부모 bash와 같은 PGID 1426815를 사용했습니다.
-T는 스레드를 숨기고 프로세스만 출력합니다. python3 아래의 [3*[{python3}]]이 사라졌습니다.
pstree -T $$bash─┬─bash───xxsleep-a
├─pstree
├─python3
├─xxsleep-a
└─3*[xxsleep-b]-A는 트리 선을 ASCII 문자로 그립니다. 선 문자가 깨져 보이는 터미널에서 사용하며, ssh로 터미널 없이 원격 명령을 실행해 결과만 받았을 때는 -A 없이도 이 선으로 나왔습니다.
pstree -A $$bash-+-bash---xxsleep-a
|-pstree
|-python3---3*[{python3}]
|-xxsleep-a
`-3*[xxsleep-b]📌 주요 옵션: 이 글에서 실행한 결과
| 옵션 | 하는 일 | 이 글에서 본 결과 | |
|---|---|---|---|
| -p | 프로세스 이름 뒤에 PID를 붙이고 같은 이름을 합치지 않음 | xxsleep-b 세 개와 python3 스레드 셋이 PID별로 한 줄씩 나옴 | |
| -c | 같은 이름의 형제 프로세스를 합치지 않음 | 3*[xxsleep-b]가 xxsleep-b 세 줄로 나옴 | |
| -a | 프로세스마다 명령줄 인자까지 출력 | xxsleep-b 40처럼 인자가 붙고, 스레드는 3*[{python3}]으로 합쳐진 채 남음 | |
| -n | 같은 부모 아래를 이름 대신 PID 순으로 정렬 | 실습 스크립트에 적은 순서대로 xxsleep-a부터 python3까지 나옴 | |
| -s | 지정한 프로세스의 부모를 systemd까지 출력 | systemd 아래 sshd 세 단계 뒤에 실습 셸이 이어짐 | |
| -u | 부모와 사용자가 다른 자리에 사용자 이름을 붙임 | 접속한 계정의 sshd에만 (user)가 붙음 | |
| -g | 프로세스 그룹 ID(PGID)를 출력 | -p와 함께 (PID,PGID) 꼴로 나오고, 백그라운드 작업마다 PGID가 따로 붙음 | |
| -T | 스레드를 숨기고 프로세스만 출력 | python3 아래 3*[{python3}]이 사라짐 | |
| -t | 스레드의 전체 이름을 출력 | 이름을 붙이지 않은 파이썬 스레드라 {python3} 그대로 나옴 | |
| -A | 트리 선을 ASCII 문자로 그림 | ─┬─ 대신 -+-, └─ 대신 `-로 나옴 | |
| -U | 트리 선을 UTF-8 문자로 그림 | 터미널에서 옵션 없이 실행한 출력과 같은 선 | |
| -l | 긴 줄을 화면 폭에서 자르지 않음 | COLUMNS=40에서 …으로 잘리던 xxsleep-a 줄이 인자 끝까지 나옴 | |
| -V | 버전 정보를 출력 | pstree (PSmisc) 23.6 |
📎 그 밖의 옵션: 공식 매뉴얼 기준
| 옵션 | 하는 일 | |
|---|---|---|
| -h | 지금 프로세스와 그 부모를 강조, 터미널이 강조를 지원하지 않으면 아무 동작 없음 | |
| -H | -h와 같지만 지정한 PID를 강조, 강조를 쓸 수 없으면 실패 | |
| -C | 지정한 속성으로 이름에 색을 입힘, 지금은 age만 받으며 60초 미만은 초록, 1시간 미만은 노랑, 나머지는 빨강 | |
| -G | 트리 선을 VT100 선 문자로 그림 | |
| -N | 지정한 네임스페이스 종류(ipc, mnt, net, pid, time, user, uts)마다 트리를 따로 출력, 일반 계정은 다른 사용자 프로세스 정보가 제한됨 | |
| -S | 네임스페이스가 바뀌는 지점을 출력, 일반 계정은 출력이 제한됨 | |
| -Z | 프로세스의 보안 속성을 출력, SELinux 시스템에서는 보안 컨텍스트 |
🔲 pstree 명령어 시뮬레이터
아래 시뮬레이터에는 같은 실습 셸이 들어 있어, 옵션을 바꿔 입력하면 트리 출력이 어떻게 바뀌는지 바로 확인할 수 있습니다.
3️⃣ pstree 명령어 설치와 오류 메시지
pstree는 psmisc 패키지에 들어 있으며, 같은 패키지에 killall과 fuser가 함께 설치됩니다. 명령을 찾을 수 없다는 오류가 나오면 Debian과 Ubuntu는 [apt install psmisc], AlmaLinux와 Rocky Linux는 [dnf install psmisc]로 설치합니다.
설치된 버전은 -V로 확인합니다.
pstree -Vpstree (PSmisc) 23.6
Copyright (C) 1993-2021 Werner Almesberger and Craig Small
PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.🔲 No such user name
PID 자리에 숫자가 아닌 글자를 적으면 사용자 이름으로 읽기 때문에, 없는 이름이면 [No such user name]이 출력되고 종료 코드는 1입니다.
pstree nosuchuserNo such user name: nosuchuser🔲 invalid option
없는 옵션을 적으면 [invalid option] 뒤에 사용법이 이어지고 종료 코드는 1입니다. 아래는 출력의 앞 네 줄이며, 그 아래에는 옵션마다 긴 이름과 한 줄 설명이 이어집니다.
pstree -xpstree: invalid option -- 'x'
Usage: pstree [-acglpsStTuZ] [ -h | -H PID ] [ -n | -N type ]
[ -A | -G | -U ] [ PID | USER ]
or: pstree -V🔢 FAQ & 추천 콘텐츠
ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.