我正在尝试编写一个脚本来跟踪您执行特定进程的次数。我想检测进程何时启动,然后记录下来。
伪代码如下:
while (true) if (process started) then log(process)
在 Linux 或 NetBSD 上有没有简单的方法可以做到这一点(最好在 shell 中,但 C 也可以)?
答案1
在 Linux 上,如果您知道进程的名称(可执行文件路径),则可以循环遍历/proc/
每个 PID 的目录并检查exe
每个 PID 目录中的文件。此文件将与您要查找的进程的可执行文件路径相同。
查看伪代码:
proc_exe="" # The full path of the executable you're interested in checking.
for d in /proc/<pid> do;
if [ ${d}/exe -eq ${proc_exe} ]; then
# Found the PID of the process you're interested in.
fi
done
这种技术比 systemd 及其同类技术更好,并且也适用于其他 Linux 发行版。
在 NetBSD 上,有一个文件cmdline
可以为您提供整个过程argv
。语义略有不同,但结果几乎相同。
答案2
传统上,在 Unix 及其衍生产品(包括 NetBSD)中,实现此目的的一种方法是启用进程记帐。
在 NetBSD 上,可以按如下方式启用和启动进程记帐:
echo accounting=YES >> /etc/rc.conf
/etc/rc.d/accounting start
在其他 BSD 和 Unix 衍生产品上也应该可以实现类似的事情。
这南非(8)命令可用于分析和汇总内核生成的会计数据,默认情况下它将打印自当前会计文件首次启动以来运行的每个命令的信息,包括每个命令的运行频率。