- 移动开发
- 开发工具
【免费下载链接】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 adpstree -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
相关推荐
pstree 命令详解:用树状图剖析 Linux 进程派生关系
pstree 命令详解:用树状图剖析 Linux 进程派生关系 导读 pstree 是 Linux 系统中用于以树状图方式展现进程之间派生(父子)关系的经典命令
文档教程ZeroTermux 内置命令手册精讲:ps 进程状态查看命令完整指南
ZeroTermux 内置命令手册精讲:ps 进程状态查看命令完整指南 本篇指南以 ZeroTermux 开源仓库内置命令手册中的 ps 文档( app/src
移动开发开发工具ZeroTermux 命令手册精讲:pmap 进程内存映射分析实战
ZeroTermux 命令手册精讲:pmap 进程内存映射分析实战 pmap 是 Linux 调试与运维中最常用的内存分析工具之一,它通过读取 /proc/<p
移动开发开发工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考