如何通过命令查看未完成且创建新Shell的命令调用栈?
查看Shell调用栈(未完成的父Shell列表)
当然有命令行工具可以直接获取这个「Shell调用栈」信息,不用依赖htop的图形界面!下面是几个最实用的方法:
1. 使用 pstree 命令(最直观)
pstree 会以树形结构展示进程关系,加上 -p 参数还能显示PID,非常适合追踪Shell的调用链。如果你想从当前Shell往上追溯所有父Shell,直接执行:
pstree -p $$
这里的 $$ 是当前Shell的PID,命令会输出从当前Shell到系统初始化进程(比如 systemd 或 init)的完整树形链。举个例子,如果你执行了 bash → su - myuser → zsh,输出会类似:
systemd(1)───sshd(1234)───bash(5678)───su(9012)───zsh(3456)
一眼就能看到所有嵌套的Shell和切换用户的进程。
2. 使用 ps 命令的树形选项
ps 也支持树形展示进程关系,常用的组合是:
ps auxf
或者更简洁的格式:
ps -ef --forest
输出会以缩进的树形结构显示所有进程,你可以找到当前Shell的PID(同样用 $$ 确认),然后往上看它的父进程、祖父进程,就能得到完整的调用栈。
3. 手动遍历 /proc 文件系统
Linux的 /proc 文件系统里保存了所有进程的详细信息,你可以手动追踪父进程ID(PPid)来构建调用栈:
- 先获取当前Shell的PID:
echo $$ - 查看父PID:
cat /proc/$(echo $$)/status | grep PPid - 重复步骤2,把上一步得到的PPid替换进去,直到PPid为1(系统初始化进程)
比如写个简单的小脚本自动遍历:
pid=$$ while [ $pid -ne 1 ]; do echo -n "$pid " pid=$(grep -oP 'PPid:\s+\K\d+' /proc/$pid/status) done echo $pid
执行后会输出从当前Shell到init的PID链,你可以结合 ps -p $pid -o comm= 来查看每个PID对应的进程名。
这些方法都能直接在命令行输出结果,完全满足你不用htop的需求,而且在远程服务器、无图形界面的环境下都能正常使用。
内容的提问来源于stack exchange,提问作者Melebius
相关产品推荐
相关产品推荐

