2012-07-26 23 views

回答

1

您可以轻松地识别子进程,例如,使用像pstree工具(这是使人类可读的输出非标准程序)。

~ $ pstree -ps "$PPID" 
init(1)───tmux(9707)─┬─bash(9708)─┬─bash(9742)───trayer(9743) 
        │   └─weechat-curses(10594) 
        ├─bash(10729)───su(10746)───bash(10752)───vim(10761) 
        ├─bash(10818)───ksh(1748) 
        ├─bash(15133)───pstree(15474) 
        ├─bash(17879)───man(15076)───sh(15079)───sh(15080)───vimmanpager(15084)───vim(15088) 
        ├─bash(17900)───su(17917)───bash(17922) 
        ├─bash(20076)───man(20095)───sh(20098)───sh(20099)───vimmanpager(20103)───vim(20109) 
        ├─bash(20116)───man(20135)───sh(20138)───sh(20139)───vimmanpager(20143)───vim(20147) 
        └─tmux-mem-cpu-lo(15472) 

如果需要的原始数据,至少在Linux下,你可以通过/proc/<pid>/stat递归爬行。您也可以使用ps,但解析其输出并不是我喜欢做的事情。

但是你的问题是“你能识别由shell创建的所有进程吗?”。技术上,不。如果您使用disown或使用nohup运行,并且尤其是在父进程死亡的情况下,则子进程可能成为init的子进程,并且与另一个进程分叉的进程无法区分。

这种情况下的解决方案是特定于平台的。如果你已经在内核中建立了支持,你可以在Linux下使用cgroups。我相信BSD的等价物被称为“监狱”。

此外,如果您尝试将跟踪进程作为脚本的一部分,而不是开发和测试以外的原因,则应该使用正确的process management。不应该在脚本中使用ps

+2

on unix(SunOS)你可以使用ptree – 2012-07-26 07:30:21

+0

你的脚本在做什么?如果它没有长时间运行或在后台运行,那么你不能在ps命令输出中看到它们,因为它只会运行并退出进程。 – Satish 2012-08-23 20:43:36