确定执行.sh创建的进程

时间:2012-07-26 04:46:32

标签: shell unix grep ps

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

ps -ef | grep代理

不返回任何内容。

谢谢, 基兰

1 个答案:

答案 0 :(得分: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的子进程,并且与从另一个shell分叉的进程无法区分。

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

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