1

我是 Unix 新手。如何找到执行 agent.sh 时创建的进程。

ps -ef | grep 代理

不返回任何东西。

谢谢,基兰

4

1 回答 1

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,但解析它的输出不是我喜欢做的事情。

但是您的问题是“您能否识别外壳创建的所有进程”。从技术上讲,没有。如果您使用disown或运行nohup,特别是如果父进程死亡,子进程可能成为init从另一个 shell 派生的进程的子进程并且无法区分。

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

此外,如果您出于开发和测试以外的原因尝试将流程作为脚本的一部分进行跟踪,您应该使用适当的流程管理ps永远不应该在脚本中使用。

于 2012-07-26T05:05:24.383 回答