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

공정위 광고 문구 Ver 3.1
공정위 광고 문구 Ver 3.2(모바일 전용)
테스트 환경Debian 계열Debian 12psmisc 23.6일반 사용자 계정2026-11-03 확인
프로세스 명령어pstree위치/usr/bin/pstree

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 40

xxsleep-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 명령어 시뮬레이터

아래 시뮬레이터에는 같은 실습 셸이 들어 있어, 옵션을 바꿔 입력하면 트리 출력이 어떻게 바뀌는지 바로 확인할 수 있습니다.

pstree 명령어 시뮬레이터psmisc 23.6
[root@server work]#
브라우저 안에서만 동작합니다. 왼쪽 목록과 PID는 예시 값이며, 트리 모양과 오류 문구는 Debian 12 서버에서 실행한 출력을 따릅니다.

3️⃣ pstree 명령어 설치와 오류 메시지

pstree는 psmisc 패키지에 들어 있으며, 같은 패키지에 killall과 fuser가 함께 설치됩니다. 명령을 찾을 수 없다는 오류가 나오면 Debian과 Ubuntu는 [apt install psmisc], AlmaLinux와 Rocky Linux는 [dnf install psmisc]로 설치합니다.

설치된 버전은 -V로 확인합니다.

pstree -V
pstree (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 nosuchuser
No such user name: nosuchuser

🔲 invalid option

없는 옵션을 적으면 [invalid option] 뒤에 사용법이 이어지고 종료 코드는 1입니다. 아래는 출력의 앞 네 줄이며, 그 아래에는 옵션마다 긴 이름과 한 줄 설명이 이어집니다.

pstree -x
pstree: invalid option -- 'x'
Usage: pstree [-acglpsStTuZ] [ -h | -H PID ] [ -n | -N type ]
              [ -A | -G | -U ] [ PID | USER ]
   or: pstree -V

🔢 FAQ & 추천 콘텐츠

pgrep으로 찾은 PID를 명령 치환으로 넘깁니다. 테스트 서버에서 [pgrep python3]은 다른 python3까지 PID 두 개를 출력했고, -n을 붙인 [pstree -p $(pgrep -n python3)]은 가장 최근에 실행한 python3과 스레드 셋만 출력했습니다.

오류 문구 없이 아무것도 출력하지 않고 종료 코드 0으로 끝납니다. 99999999를 적어 실행한 결과 화면은 비어 있었고 종료 코드도 0이었습니다. 그래서 스크립트에서 프로세스가 남아 있는지 확인할 때는 종료 코드 대신 출력이 비었는지를 봅니다.

공식 매뉴얼 기준으로 proc 파일 시스템의 hidepid 옵션처럼 다른 프로세스의 정보를 숨기는 설정이 있으면, pstree는 그 정보 없이 트리를 만들고 프로세스 이름을 물음표로 출력합니다. 이 글의 테스트 서버에서는 물음표가 나오지 않았습니다.

ℹ️ 제휴 안내
본 사이트의 콘텐츠에는 제휴 링크가 포함되어 있습니다. 방문자가 이 링크를 통해 상품 또는 서비스를 구매하면 본 사이트는 판매처로부터 수수료를 지급받습니다. 이 과정에서 구매자가 지불하는 금액(이벤트 할인 시 금액이 내려갑니다↓)은 오르지 않습니다. 게시된 가격·할인·재고 정보는 작성 시점 기준이며 실제와 다를 수 있으므로, 구매 전 판매처에서 최종 확인하시기 바랍니다. 상품 선정과 평가는 자체 기준에 따라 작성되며, 수수료 지급 여부가 소개 순서나 평가 내용에 영향을 주지 않습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Prove your humanity: 0   +   8   =