Gra*_*eme 11 process monitoring
从这里的问题来看,OP 想要反复轮询pidof
在 shell 脚本中使用的进程的 pid 。当然,这是低效的,因为必须pidof
每秒多次为程序启动一个新进程(我不知道这是问题中 CPU 峰值的原因,但似乎很可能)。
通常在 shell 脚本中解决这种事情的方法是使用单个程序来输出您需要的数据stdout
,然后在必要时进行一些文本处理。虽然这涉及更多的程序同时运行,但它可能会降低 CPU 密集度,因为不会为了轮询目的而不断创建新进程。
因此,对于上述问题,一种解决方案可能是让一些程序在创建进程时输出进程的名称和 pid。然后你可以做这样的事情:
pids-names |
grep some_program |
cut -f 2 |
while read pid; do
process-pid "$pid"
done
Run Code Online (Sandbox Code Playgroud)
这样做的问题是它提出了一个更基本的问题,如何在创建 pid 和进程名称时打印它们?
我找到了一个名为 的程序ps-watcher
,尽管它的问题在于它只是一个perl
重复运行的脚本,ps
所以它并没有真正解决问题。另一种选择是使用auditd
如果日志直接通过tail -f
. 一个理想的解决方案会比这更简单、更便携,但auditd
如果它是最好的选择,我会接受一个解决方案。
特定于 Linux 的答案:
perf-tools 包含一个执行此操作的execsnoop。它使用各种特定于 Linux 的功能,例如 ftrace。在 Debian 上,它在perf-tools-unstable包中。
我man cat
在另一个终端中运行的示例:
root@Zia:~# execsnoop
TIME PID PPID ARGS
17:24:26 14189 12878 man cat
17:24:26 14196 14189 tbl
17:24:26 14195 14189 preconv -e UTF-8
17:24:26 14199 14189 /bin/sh /usr/bin/nroff -mandoc -Tutf8
17:24:26 14200 14189 less
17:24:26 14201 14199 locale charmap
17:24:26 14202 14199 groff -mtty-char -Tutf8 -mandoc
17:24:26 14203 14202 troff -mtty-char -mandoc -Tutf8
17:24:26 14204 14202 grotty
Run Code Online (Sandbox Code Playgroud)
我怀疑是否有一种便携式方法可以做到这一点。