创建进程时打印 pid 和名称

创建进程时打印 pid 和名称

从问题来看这里pidof,OP 希望在 shell 脚本中重复轮询进程的 pid 。当然,这是低效的,因为必须pidof每秒多次启动程序的新进程(我不知道这是问题中 CPU 峰值的原因,但似乎有可能)。

通常,在 shell 脚本中解决此类问题的方法是使用单个程序来输出所需的数据stdout,然后在必要时进行一些文本处理。虽然这涉及同时运行更多程序,但由于不会出于轮询目的不断创建新进程,因此 CPU 密集程度可能较低。

因此,对于上述问题,一种解决方案可能是使用一些程序来输出进程创建时的名称和 pid。然后你可以做类似的事情:

pids-names |
  grep some_program |
  cut -f 2 |
  while read pid; do
    process-pid "$pid"
  done

这样做的问题是它提出了一个更基本的问题,如何在创建 pid 和进程名称时打印它们?

我找到了一个名为 的程序ps-watcher,但问题是它只是一个perl重复运行的脚本ps,因此它并不能真正解决问题。另一种选择是使用auditd如果日志直接通过tail -f.理想的解决方案会比这更简单、更便携,但auditd如果它是最佳选择,我会接受它。

答案1

Linux 特定答案:

perf-tools 包含一个执行监听正是这样做的。它使用各种特定于 Linux 的功能,例如 ftrace。在 Debian 上,它位于性能工具不稳定包裹。

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 

我怀疑是否有一种便携式方法可以做到这一点。

答案2

那里正道TM这样做很大程度上取决于您实际运行的系统和内核。DTrace应该可以在 Solaris、Free/NetBSD 和 Linux 上运行。

特别是对于 Linux,您可以使用 ftrace(必须在编译时启用 - 通常是这样)或通过 netlink 的 proc events - 请参阅所以答案问题的更多细节(记得投票,接受答案的分数 ~30 vs. 0 看起来很有趣)。穷人的跟踪器可能可以通过使用来实现strace -eexec,fork(尽管开销不合理)。

相关内容