Lệnh pstree trong Linux

Giới thiệu

Trong lab này, chúng ta sẽ khám phá lệnh pstree của Linux, một công cụ hữu ích để trực quan hóa hệ thống phân cấp tiến trình trên hệ thống Linux. Lệnh pstree hiển thị một biểu diễn dạng cây của các tiến trình đang chạy, cho thấy mối quan hệ cha-con giữa chúng. Điều này có thể hữu ích để hiểu cấu trúc và sự phụ thuộc của các tiến trình trong hệ thống của bạn. Chúng ta sẽ bắt đầu bằng cách hiểu lệnh pstree, sau đó khám phá hệ thống phân cấp tiến trình bằng pstree và cuối cùng là học cách lọc và tùy chỉnh đầu ra của pstree.

Tìm hiểu về lệnh pstree

Trong bước này, chúng ta sẽ tìm hiểu về lệnh pstree, một công cụ hữu ích để trực quan hóa hệ thống phân cấp tiến trình trên hệ thống Linux.

Lệnh pstree hiển thị một biểu diễn dạng cây của các tiến trình đang chạy, cho thấy mối quan hệ cha-con giữa chúng. Điều này có thể hữu ích để hiểu cấu trúc và sự phụ thuộc của các tiến trình trong hệ thống của bạn.

Để bắt đầu, hãy chạy lệnh pstree trong terminal:

$ pstree
systemd─┬─ModemManager─┬─dhclient
        │             └─2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2─┬─apache2
        │         └─2*[apache2]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │         │            │                └─3*[{containerd-shim}]
        │         │            └─6*[{containerd}]
        │         └─7*[{dockerd}]
        ├─gdm3─┬─Xorg
        │      └─gnome-session-b─┬─gnome-shell
        │                        ├─ibus-daemon─┬─ibus-engine-sim
        │                        │             └─2*[{ibus-daemon}]
        │                        └─2*[{gnome-session-b}]
        ├─irqbalance
        ├─kerneloops
        ├─kube-proxy
        ├─kubelet
        ├─lightdm─┬─Xorg
        │         └─lightdm───sh───fluxbox
        ├─lxcfs
        ├─lxd─┬─lxd
        │     └─2*[{lxd}]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd
        ├─snapd───10*[{snapd}]
        ├─ssh-agent
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-networkd
        ├─systemd-resolve
        ├─systemd-timesyn
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        ├─unattended-upgr───2*[{unattended-upgr}]
        ├─upowerd───2*[{upowerd}]
        ├─user-manager───3*[{user-manager}]
        └─whoopsie───2*[{whoopsie}]

Đầu ra hiển thị chế độ xem phân cấp của các tiến trình đang chạy, với tiến trình systemd ở trên cùng là cha của nhiều tiến trình khác.

Bạn có thể tùy chỉnh đầu ra của pstree bằng nhiều tùy chọn khác nhau. Ví dụ: để chỉ hiển thị ID tiến trình (PID) thay vì tên tiến trình, bạn có thể sử dụng tùy chọn -p:

$ pstree -p
systemd(1)─┬─ModemManager(577)─┬─dhclient(593)
          │                   └─2*[{ModemManager}(580,581)]
          ├─NetworkManager(572)─┬─dhclient(590)
          │                    └─2*[{NetworkManager}(573,574)]
          ├─accounts-daemon(531)───2*[{accounts-daemon}(532,533)]
          ├─apache2(688)─┬─apache2(689)
          │             └─2*[apache2(690,691)]
          ├─atd(544)
          ├─cron(545)
          ├─dbus-daemon(530)
          ├─dockerd(688)─┬─containerd(701)─┬─containerd-shim(702)─┬─bash(703)
          │             │                 │                       └─3*[{containerd-shim}(704,705,706)]
          │             │                 └─6*[{containerd}(707,708,709,710,711,712)]
          │             └─7*[{dockerd}(689,690,691,692,693,694,695)]
          ├─gdm3(575)─┬─Xorg(586)
          │           └─gnome-session-b(587)─┬─gnome-shell(588)
          │                                 ├─ibus-daemon(589)─┬─ibus-engine-sim(592)
          │                                 │                  └─2*[{ibus-daemon}(590,591)]
          │                                 └─2*[{gnome-session-b}(595,596)]
          ├─irqbalance(543)
          ├─kerneloops(546)
          ├─kube-proxy(697)
          ├─kubelet(696)
          ├─lightdm(576)─┬─Xorg(585)
          │              └─lightdm(577)───sh(578)───fluxbox(579)
          ├─lxcfs(542)
          ├─lxd(698)─┬─lxd(699)
          │         └─2*[{lxd}(700,701)]
          ├─polkitd(534)───2*[{polkitd}(535,536)]
          ├─rsyslogd(541)
          ├─snapd(694)───10*[{snapd}(695,696,697,698,699,700,701,702,703,704)]
          ├─ssh-agent(587)
          ├─systemd-journal(526)
          ├─systemd-logind(529)
          ├─systemd-networkd(527)
          ├─systemd-resolve(528)
          ├─systemd-timesyn(540)
          ├─systemd-udevd(525)
          ├─udisksd(537)───3*[{udisksd}(538,539,540)]
          ├─unattended-upgr(547)───2*[{unattended-upgr}(548,549)]
          ├─upowerd(535)───2*[{upowerd}(536,537)]
          ├─user-manager(586)───3*[{user-manager}(587,588,589)]
          └─whoopsie(550)───2*[{whoopsie}(551,552)]

Điều này hiển thị ID tiến trình thay vì tên tiến trình.

Bạn cũng có thể sử dụng tùy chọn -u để hiển thị người dùng đang chạy mỗi tiến trình:

$ pstree -u
systemd─┬─ModemManager─┬─dhclient
        │             └─2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2─┬─apache2
        │         └─2*[apache2]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │         │            │                └─3*[{containerd-shim}]
        │         │            └─6*[{containerd}]
        │         └─7*[{dockerd}]
        ├─gdm3─┬─Xorg
        │      └─gnome-session-b─┬─gnome-shell
        │                        ├─ibus-daemon─┬─ibus-engine-sim
        │                        │             └─2*[{ibus-daemon}]
        │                        └─2*[{gnome-session-b}]
        ├─irqbalance
        ├─kerneloops
        ├─kube-proxy
        ├─kubelet
        ├─lightdm─┬─Xorg
        │         └─lightdm───sh───fluxbox
        ├─lxcfs
        ├─lxd─┬─lxd
        │     └─2*[{lxd}]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd
        ├─snapd───10*[{snapd}]
        ├─ssh-agent
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-networkd
        ├─systemd-resolve
        ├─systemd-timesyn
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        ├─unattended-upgr───2*[{unattended-upgr}]
        ├─upowerd───2*[{upowerd}]
        ├─user-manager───3*[{user-manager}]
        └─whoopsie───2*[{whoopsie}]

Điều này hiển thị người dùng đang chạy mỗi tiến trình.

Lệnh pstree có thể là một công cụ có giá trị để hiểu hệ thống phân cấp tiến trình trên hệ thống Linux của bạn. Trong bước tiếp theo, chúng ta sẽ khám phá thêm các cách sử dụng pstree để có được thông tin chi tiết về các tiến trình của hệ thống.

Khám phá hệ thống phân cấp tiến trình với pstree

Trong bước này, chúng ta sẽ đi sâu hơn vào hệ thống phân cấp tiến trình bằng lệnh pstree và khám phá các tùy chọn khác nhau để tùy chỉnh đầu ra.

Đầu tiên, hãy xem cách chúng ta có thể hiển thị hệ thống phân cấp tiến trình một cách cô đọng hơn bằng tùy chọn -c:

$ pstree -c
systemd─┬─ModemManager─┬─dhclient
        │             └─2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2─┬─apache2
        │         └─2*[apache2]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │         │            │                └─3*[{containerd-shim}]
        │         │            └─6*[{containerd}]
        │         └─7*[{dockerd}]
        ├─gdm3─┬─Xorg
        │      └─gnome-session-b─┬─gnome-shell
        │                        ├─ibus-daemon─┬─ibus-engine-sim
        │                        │             └─2*[{ibus-daemon}]
        │                        └─2*[{gnome-session-b}]
        ├─irqbalance
        ├─kerneloops
        ├─kube-proxy
        ├─kubelet
        ├─lightdm─┬─Xorg
        │         └─lightdm───sh───fluxbox
        ├─lxcfs
        ├─lxd─┬─lxd
        │     └─2*[{lxd}]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd
        ├─snapd───10*[{snapd}]
        ├─ssh-agent
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-networkd
        ├─systemd-resolve
        ├─systemd-timesyn
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        ├─unattended-upgr───2*[{unattended-upgr}]
        ├─upowerd───2*[{upowerd}]
        ├─user-manager───3*[{user-manager}]
        └─whoopsie───2*[{whoopsie}]

Tùy chọn -c nén đầu ra, giúp dễ đọc và hiểu hệ thống phân cấp tiến trình hơn.

Tiếp theo, hãy xem cách chúng ta có thể lọc đầu ra để tập trung vào các tiến trình cụ thể. Ví dụ: để chỉ hiển thị các tiến trình liên quan đến dịch vụ docker, chúng ta có thể sử dụng tùy chọn -a:

$ pstree -a | grep docker
dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │            │                └─3*[containerd-shim]
        │            └─6*[containerd]
        └─7*[dockerd]

Điều này hiển thị các tiến trình docker và các tiến trình con của chúng.

Bạn cũng có thể sử dụng tùy chọn -p để hiển thị ID tiến trình (PID) thay vì tên tiến trình:

$ pstree -p | grep docker
dockerd(688)─┬─containerd(701)─┬─containerd-shim(702)─┬─bash(703)
             │                 │                     └─3*[containerd-shim(704,705,706)]
             │                 └─6*[containerd(707,708,709,710,711,712)]
             └─7*[dockerd(689,690,691,692,693,694,695)]

Điều này có thể hữu ích khi bạn cần xác định các tiến trình cụ thể theo PID của chúng.

Cuối cùng, hãy xem cách chúng ta có thể hiển thị hệ thống phân cấp tiến trình cho một người dùng cụ thể. Để thực hiện việc này, chúng ta có thể sử dụng tùy chọn -u theo sau là tên người dùng:

$ pstree -u labex
systemd─┬─ModemManager─┬─dhclient
        │             └─2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2─┬─apache2
        │         └─2*[apache2]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │         │            │                └─3*[{containerd-shim}]
        │         │            └─6*[{containerd}]
        │         └─7*[{dockerd}]
        ├─gdm3─┬─Xorg
        │      └─gnome-session-b─┬─gnome-shell
        │                        ├─ibus-daemon─┬─ibus-engine-sim
        │                        │             └─2*[{ibus-daemon}]
        │                        └─2*[{gnome-session-b}]
        ├─irqbalance
        ├─kerneloops
        ├─kube-proxy
        ├─kubelet
        ├─lightdm─┬─Xorg
        │         └─lightdm───sh───fluxbox
        ├─lxcfs
        ├─lxd─┬─lxd
        │     └─2*[{lxd}]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd
        ├─snapd───10*[{snapd}]
        ├─ssh-agent
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-networkd
        ├─systemd-resolve
        ├─systemd-timesyn
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        ├─unattended-upgr───2*[{unattended-upgr}]
        ├─upowerd───2*[{upowerd}]
        ├─user-manager───3*[{user-manager}]
        └─whoopsie───2*[{whoopsie}]

Điều này hiển thị hệ thống phân cấp tiến trình cho người dùng labex.

Lệnh pstree cung cấp vô số thông tin về hệ thống phân cấp tiến trình trên hệ thống Linux của bạn. Bằng cách sử dụng các tùy chọn khác nhau, bạn có thể tùy chỉnh đầu ra cho phù hợp với nhu cầu của mình và hiểu sâu hơn về các tiến trình của hệ thống.

Lọc và tùy chỉnh đầu ra pstree

Trong bước cuối cùng này, chúng ta sẽ khám phá thêm các cách để lọc và tùy chỉnh đầu ra của lệnh pstree cho phù hợp với nhu cầu cụ thể của bạn.

Một trường hợp sử dụng phổ biến là tập trung vào một tiến trình hoặc nhóm tiến trình cụ thể. Ví dụ: giả sử bạn muốn xem hệ thống phân cấp tiến trình cho tiến trình systemd và các tiến trình con của nó. Bạn có thể sử dụng tùy chọn -s để thực hiện việc này:

$ pstree -s systemd
systemd

Điều này hiển thị tiến trình systemd và các tiến trình con trực tiếp của nó.

Bạn cũng có thể sử dụng tùy chọn -g để nhóm các tiến trình theo ID nhóm tiến trình (PGID) của chúng thay vì hệ thống phân cấp tiến trình:

$ pstree -g
1-systemd
  ├─577-ModemManager
  │   ├─593-dhclient
  │   └─2*[580-{ModemManager},581-{ModemManager}]
  ├─572-NetworkManager
  │   ├─590-dhclient
  │   └─2*[573-{NetworkManager},574-{NetworkManager}]
  ├─531-accounts-daemon
  │   ├─532-{accounts-daemon}
  │   └─533-{accounts-daemon}
  ├─688-apache2
  │   ├─689-apache2
  │   └─2*[690-apache2,691-apache2]
  ├─544-atd
  ├─545-cron
  ├─530-dbus-daemon
  ├─688-dockerd
  │   ├─701-containerd
  │   │   ├─702-containerd-shim
  │   │   │   └─703-bash
  │   │   └─6*[707-{containerd},708-{containerd},709-{containerd},710-{containerd},711-{containerd},712-{containerd}]
  │   └─7*[689-{dockerd},690-{dockerd},691-{dockerd},692-{dockerd},693-{dockerd},694-{dockerd},695-{dockerd}]
  ├─575-gdm3
  │   ├─586-Xorg
  │   └─587-gnome-session-b
  │       ├─588-gnome-shell
  │       ├─589-ibus-daemon
  │       │   ├─592-ibus-engine-sim
  │       │   └─2*[590-{ibus-daemon},591-{ibus-daemon}]
  │       └─2*[595-{gnome-session-b},596-{gnome-session-b}]
  ├─543-irqbalance
  ├─546-kerneloops
  ├─697-kube-proxy
  ├─696-kubelet
  ├─576-lightdm
  │   ├─585-Xorg
  │   └─577-lightdm
  │       ├─578-sh
  │       └─579-fluxbox
  ├─542-lxcfs
  ├─698-lxd
  │   ├─699-lxd
  │   └─2*[700-{lxd},701-{lxd}]
  ├─534-polkitd
  │   ├─535-{polkitd}
  │   └─536-{polkitd}
  ├─541-rsyslogd
  ├─694-snapd
  │   └─10*[695-{snapd},696-{snapd},697-{snapd},698-{snapd},699-{snapd},700-{snapd},701-{snapd},702-{snapd},703-{snapd},704-{snapd}]
  ├─587-ssh-agent
  ├─526-systemd-journal
  ├─529-systemd-logind
  ├─527-systemd-networkd
  ├─528-systemd-resolve
  ├─540-systemd-timesyn
  ├─525-systemd-udevd
  ├─537-udisksd
  │   ├─538-{udisksd}
  │   ├─539-{udisksd}
  │   └─540-{udisksd}
  ├─547-unattended-upgr
  │   ├─548-{unattended-upgr}
  │   └─549-{unattended-upgr}
  ├─535-upowerd
  │   ├─536-{upowerd}
  │   └─537-{upowerd}
  ├─586-user-manager
  │   ├─587-{user-manager}
  │   ├─588-{user-manager}
  │   └─589-{user-manager}
  └─550-whoopsie
      ├─551-{whoopsie}
      └─552-{whoopsie}

Điều này nhóm các tiến trình theo ID nhóm tiến trình của chúng, có thể hữu ích để hiểu mối quan hệ giữa các tiến trình.

Bạn cũng có thể sử dụng tùy chọn -H để làm nổi bật tiến trình hiện tại trong đầu ra:

$ pstree -H $$
systemd─┬─ModemManager─┬─dhclient
        │             └─2*[{ModemManager}]
        ├─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─apache2─┬─apache2
        │         └─2*[apache2]
        ├─atd
        ├─cron
        ├─dbus-daemon
        ├─dockerd─┬─containerd─┬─containerd-shim─┬─bash
        │         │            │                └─3*[{containerd-shim}]
        │         │            └─6*[{containerd}]
        │         └─7*[{dockerd}]
        ├─gdm3─┬─Xorg
        │      └─gnome-session-b─┬─gnome-shell
        │                        ├─ibus-daemon─┬─ibus-engine-sim
        │                        │             └─2*[{ibus-daemon}]
        │                        └─2*[{gnome-session-b}]
        ├─irqbalance
        ├─kerneloops
        ├─kube-proxy
        ├─kubelet
        ├─lightdm─┬─Xorg
        │         └─lightdm───sh───fluxbox
        ├─lxcfs
        ├─lxd─┬─lxd
        │     └─2*[{lxd}]
        ├─polkitd───2*[{polkitd}]
        ├─rsyslogd
        ├─snapd───10*[{snapd}]
        ├─ssh-agent
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-networkd
        ├─systemd-resolve
        ├─systemd-timesyn
        ├─systemd-udevd
        ├─udisksd───3*[{udisksd}]
        ├─unattended-upgr───2*[{unattended-upgr}]
        ├─upowerd───2*[{upowerd}]
        ├─user-manager───3*[{user-manager}]
        └─whoopsie───2*[{whoopsie}]

Điều này làm nổi bật tiến trình hiện tại (trong trường hợp này là tiến trình shell) trong đầu ra.

Lệnh pstree cung cấp vô số tùy chọn để lọc và tùy chỉnh đầu ra cho phù hợp với nhu cầu cụ thể của bạn. Bằng cách khám phá các tùy chọn này, bạn có thể hiểu sâu hơn về hệ thống phân cấp tiến trình trên hệ thống Linux của mình và theo dõi và quản lý các tiến trình của hệ thống hiệu quả hơn.

Tóm tắt

Trong lab này, chúng ta đã tìm hiểu về lệnh pstree, một công cụ hữu ích để trực quan hóa hệ thống phân cấp tiến trình trên hệ thống Linux. Chúng ta đã khám phá cách sử dụng pstree để hiểu mối quan hệ cha-con giữa các tiến trình đang chạy và cách lọc và tùy chỉnh đầu ra để tập trung vào các tiến trình hoặc nhóm tiến trình cụ thể.

Lab bao gồm các kiến thức cơ bản về lệnh pstree, bao gồm cách chạy nó và diễn giải đầu ra dạng cây. Chúng ta cũng đã học cách sử dụng các tùy chọn khác nhau để lọc đầu ra, chẳng hạn như chỉ hiển thị các tiến trình cụ thể hoặc ẩn một số nhóm tiến trình nhất định. Đến cuối lab, chúng ta đã hiểu rõ hơn về cách sử dụng pstree để phân tích hiệu quả cấu trúc tiến trình trên hệ thống Linux.

400+ câu lệnh phổ biến trong Linux