我是Unix新手。 如何查找执行agent.sh时创建的进程。
ps -ef | grep代理
不返回任何内容。
谢谢, 基兰
答案 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
。