ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

ZeroTermux 命令手册精讲:pstree 以树状图洞察进程派生关系

ZeroTermux 命令手册精讲:pstree 以树状图洞察进程派生关系
  • 移动开发
  • 开发工具

【免费下载链接】ZeroTermux

项目地址:https://gitcode.com/GitHub_Trending/ze/ZeroTermux
点击查看免费下载

进程是 Linux 系统的运行单元,而进程之间"谁派生了谁"的父子关系,是排查僵尸进程、定位守护进程启动链、理解多线程程序结构的关键信息。pstree命令正是以树状图形式直观呈现这一关系的经典工具。本文以 ZeroTermux 内置命令手册中 pstree.md 的完整内容为骨架,逐一拆解其语法、全部选项与实战用法,并结合仓库源码说明该手册在 ZeroTermux 中的查阅方式,帮助你既读懂命令,也能在 Android 终端环境中随时调用它。

pstree 是什么:从进程表到进程树

pstree命令以树状图的方式展现进程之间的派生关系,显示效果比较直观。

与ps(进程快照列表)和top(动态进程监控)不同,pstree的核心价值在于层级关系:

  • ps输出的是一张扁平的"进程表",需要通过PPID字段人工比对才能还原父子关系;
  • pstree则把这种关系直接画成树:根是系统的 1 号进程(init或systemd),枝干是逐级 fork 出来的子进程,一眼就能看出某个服务是谁拉起来的、某个进程下挂了多少子进程与线程。

pstree属于 psmisc 软件包(该包还包含fuser、killall等进程管理工具)。在常规 Linux 发行版中随基础工具集提供;在 Termux 类环境中,也可通过包管理器安装对应软件包后使用,适用前提是当前终端会话的PATH中能找到该命令(ZeroTermux 的会话环境由 execTermuxEnv.sh 初始化,其将$PREFIX/bin加入PATH)。

语法

pstree(选项)

pstree的基本语法非常简单:直接执行则显示当前系统中所有进程的进程树;也可以像pstree <pid>或pstree <用户名>这样指定起点,只看某个进程或某个用户名下的进程子树。

选项详解

原手册共列出 11 个选项,覆盖了显示粒度、排序方式、字符集与高亮定位等全部维度:

选项说明
-a显示每个程序的完整指令,包含路径、参数或是常驻服务的标示
-c不使用精简标示法(默认情况下,同名进程分支会被合并压缩,-c强制展开显示每个分支)
-G使用 VT100 终端机的列绘图字符
-h列出树状图时,特别标明现在执行的程序(高亮当前 shell 所在进程)
-H<程序识别码>效果与-h类似,但特别标明指定的程序(高亮指定 PID 的进程)
-l采用长列格式显示树状图(当进程树过长、默认会截断时,用-l显示完整树)
-n用程序识别码(PID)排序,预设是以程序名称来排序
-p显示程序识别码(每个进程名后附带 PID,如bash(1234))
-u显示用户名称(进程所属用户不同时会标注)
-U使用 UTF-8 列绘图字符(绘制树形连线更美观)
-V显示版本信息

逐个说明几个容易忽略的细节:

  • -a与-p的区别:-p只追加 PID 数字;-a则把完整的命令行(路径、参数)展示出来,常用于确认某个进程到底带什么参数运行、是否常驻(daemon)服务。
  • -h与-H的区别:-h由程序自己判定"当前正在执行的程序"并高亮;-H <pid>则把高亮目标指定为任意 PID,适合在脚本或复杂树中快速定位目标进程。
  • -n的排序基准:默认按进程名称的字典序排列兄弟节点,加-n后改为按 PID 数值排序,便于对照ps输出的数字关系。
  • -c的"精简标示法":pstree 默认会把内容相同的子树折叠,-c强制不折叠,适合需要精确统计每个分支数量的场景。
  • -G与-U:两者都用于调整连线字符,-G面向 VT100 等老式终端,-U面向现代 UTF-8 终端,输出符号更规整。

输出解读:读懂树形符号与线程标记

一次典型的pstree输出形如:

systemd─┬─NetworkManager───2*[{NetworkManager}] ├─sshd───bash───pstree └─cron

要点如下:

  • 顶层是 1 号进程(systemd或init),用─┬─、├─、└─等连线符号表达分支层级;
  • 2*[{NetworkManager}]表示该进程下有 2 个同名线程被合并显示,{}大括号即线程标记;
  • 加-p后每个名字后出现(PID),可同时看到树形结构与进程号。

仓库中 pstack.md 保存了一段真实的pstree -p输出,是解读树形结构与线程标记的绝佳样例:

pstree -p work | grep ad sshd(22669)---bash(22670)---ad_preprocess(4551)-+-{ad_preprocess}(4552) |-{ad_preprocess}(4553) |-{ad_preprocess}(4554) |-{ad_preprocess}(4555) |-{ad_preprocess}(4556) `-{ad_preprocess}(4557)

其中work为工作用户,-p显示进程识别码。该输出清楚地表明:sshd(22669)派生bash(22670),bash再派生ad_preprocess(4551),而ad_preprocess共启动了 6 个子线程(大括号中的 4552~4557),加上主线程共 7 个线程。该手册文档还进一步用ps -Lf 4551验证了这一结论——NLWP列为 7,证明 pstree 的线程展示与 ps 的线程统计完全一致。

实战实例

显示所有进程及其 PID

显示当前所有进程的进程号和进程 id:

pstree -p

这是最常用的组合:既保留树形层级,又带上每个节点的 PID,后续可直接把 PID 用于kill、strace、pstack等操作。

显示所有进程的完整命令行

显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示:

pstree -a

-a会展开每个进程的完整指令(路径与参数)。"遇到相同的进程名可以压缩显示"指默认的精简折叠行为:同名的重复分支会被合并,使输出更紧凑;若想完全展开,可加-c。

显示用户与排序

pstree -u # 标注每个进程的所属用户 pstree -n # 兄弟节点按 PID 数值排序 pstree -p -u # 同时显示 PID 与用户名

-u在多用户系统(如同时有 root 服务与普通用户进程)中特别有用,能一眼区分进程归属。

高亮定位指定进程

pstree -H 4551 # 高亮 PID 为 4551 的进程

在进程树很长时,用-H指定目标 PID,让该进程在输出中突出显示,适合在脚本中自动化定位。

与 grep 组合:从进程树中抽取目标分支

进程树整体可能很长,用管道配合grep即可只保留关心的子树。沿用 pstack.md 中的真实用法:

pstree -p work | grep ad

pstree -p先列出work用户下的完整进程树,grep ad再过滤出与ad相关的进程及其子树行,从而快速确认目标进程的父子链与线程数量。

与 watch 组合:周期性监控进程结构变化

进程树不是静态的,配合周期执行命令的watch可以动态观察其变化。仓库 watch.md 中给出的用法是:

watch -n 1 -d 'pstree|grep http' # 每隔一秒高亮显示 http 相关进程树的变化情况

这里有两个要点:

  • watch -n 1表示每秒刷新一次,-d让变化的区域高亮;
  • 命令中带管道符|时,必须用单引号''将整条命令括起来,否则 shell 会把管道解析到watch本身而不是pstree。

同理,watch -d 'pstree -p | head -30'可以持续盯住进程树顶部结构的变动。

长树与折叠

pstree -l # 长列格式,显示完整树而不截断 pstree -c # 不压缩同名分支 pstree -l -c -p # 完整、不折叠、带 PID

当进程树层级很深或分支极多时,pstree 默认会截断输出;-l关闭截断,-c关闭同名压缩,两者结合可获得最完整的视图。

在 ZeroTermux 中查阅与使用

命令手册的入口与渲染机制

pstree.md并非孤立文件,它位于 ZeroTermux 内置命令手册目录 app/src/main/assets/cmd 下,与ps、top、watch、pstack等数百条 Linux 命令手册同处一处,全部以 Markdown 格式存放。

在应用内查看手册的入口与实现如下:

  • 入口:终端界面的悬浮窗/命令面板中点击"命令"按钮,会弹出命令手册对话框,相关代码位于 BoomWindow.java——点击事件中执行new CommandDialog(termuxActivity).show();
  • 列表加载:CommandDialog.java 的initData()通过assetManager.list("cmd")枚举assets/cmd目录下的全部手册文件,形成命令列表,并支持关键字搜索过滤;
  • 渲染展示:点击某条命令后,showCmdDetail()(CommandDialog.java)用 commonmark 的Parser解析对应.md文件,再经HtmlRenderer渲染为 HTML,最终在WebView中展示——本文所讲的语法、选项与实例,正是你在该对话框中看到的内容。

也就是说,本文全部内容均可在 ZeroTermux 应用中离线查阅,无需联网。

在终端中实际执行

手册是"说明书",真正使用还需在终端中运行命令。ZeroTermux 的会话由 execTermuxEnv.sh 初始化,其中将$PREFIX/bin(如/data/data/com.termux/files/usr/bin)加入PATH,并指定 bash 作为登录 shell。因此只要环境中安装了pstree(psmisc 包提供),即可直接执行:

pstree -p | head -30 # 查看进程树前 30 行 pstree -p -H $$ # 高亮当前 shell 自身 pstree -u # 按用户标注进程归属 pstree -V # 查看版本信息

-H $$中$$是当前 shell 的 PID,这是把"高亮当前进程"这一需求落到实处的常用技巧。

常见问题与排查技巧

  • 输出被截断怎么办:树太长时 pstree 默认只显示一部分,加-l显示完整长格式。
  • 同名进程太多看不清:默认折叠显示(如5*[nginx]),需要逐个展开时加-c。
  • 想同时看 PID 和命令行:pstree -a -p组合使用。
  • 只关心某个用户/某个进程:pstree <用户名>或pstree <pid>直接把起点指定为子树根。
  • 排查线程数:pstree -p <pid>数大括号{}中线程的个数,再用ps -Lf <pid>的NLWP列交叉验证(可参考 pstack.md 中的完整对照案例)。

小结

pstree用一棵树解决了ps需要反复比对 PPID 才能回答的问题:谁启动了谁、一个进程下挂了多少子进程与线程、整棵进程树长什么样。掌握本文的 11 个选项与组合用法(-p看 PID、-a看命令行、-H高亮定位、管道接grep/watch做过滤与监控),足以覆盖日常排障的绝大部分场景。在 ZeroTermux 中,你既可以在终端里直接执行这些命令,也可以通过命令手册对话框离线查阅完整说明,两者配合使用效率更高。

  • 移动开发
  • 开发工具

【免费下载链接】ZeroTermux

项目地址:https://gitcode.com/GitHub_Trending/ze/ZeroTermux
点击查看免费下载
上一篇:Tornado错误处理终极指南:如何优雅处理Web应用中的异常和故障
下一篇:D2图表类型大全:从流程图到架构图的终极指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进