在创建进程时打印进程的pid和名称


10

这里的问题开始,OP希望重复轮询pidofshell脚本中使用的进程的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
一个有趣的旁注是,首先将pid创建为创建过程(或变体)的副本fork,然后使用该exec家族的成员来启动新程序。因此,您可能想登录而exec*不是fork
derobert

2
我知道的唯一可移植的有效方法是使用普通的Unix进程记帐,它将进程退出写一条记录。如果要在创建或执行过程时捕获它们,则可能需要特定于系统的内容,例如Linux auditd,systemtap或dtrace。
Mark Plotnick 2014年

因此,对于上述问题,一个解决方案可能是拥有一些程序,该程序在创建过程时输出过程的名称和pid。–创建它们时?听起来您在想的是观察者(这就是他们在网络浏览器世界中所说的)。我想知道Python是否适合充当“门卫”?实际上,Python可以非常深入地研究系统的内部工作原理(例如dbus)。
2014年

1
@syntaxerror在这种情况下,DBus离系统的内部工作还很远-实际上,它比此处讨论的内容高出两个级别。
彼得2014年

好的,在OSI术语中,此处讨论的可能仍低于dbus。我承认我没有深入考虑过两者是否在同一层上。
语法错误

Answers:


6

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 

我怀疑是否存在可移植的方法。


2

正确的方式TM这样的在很大程度上取决于什么样的系统和内核你实际运行上。DTrace应该可以在Solaris,Free / NetBSD和Linux上运行。

特别是对于Linux,您可以使用ftrace(通常必须在编译时启用它-通常是启用)或通过netlink的proc事件- 有关更多详细信息,请参见SO的问题答案(并记住对它进行评分,得分〜接受的答案是30比0。穷人的跟踪器可能可以通过使用来实现strace -eexec,fork(尽管开销不合理)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.