为了监视进程创建,我想定期将内核分配的最后一个 PID 写入任何系统上的进程(不仅仅是 PID 监控程序创建的进程),带有文件的时间戳(使用守护进程来避免创建任何额外的进程)。任何语言都可以,但我感觉这在 POSIX shell 中应该是可能的(甚至很容易)。
答案1
这会在 Bash 中每秒保存时间戳和最后一个 PID 文件,使用ns_last_pid
系统控制:
当前(使用此 sysctl 的一个任务所在的)pid 命名空间中分配的最后一个 pid。
old=""
while read < /proc/sys/kernel/ns_last_pid
do
if [ "$REPLY" != "$old" ]
then
printf '%(%s)T %d\n' -1 "$REPLY"
old=$REPLY
fi
read -t 1 || true
done > pids.log
问题:
/proc/sys/kernel/ns_last_pid
只是在 Linux 3.3 中可用和较新的- 说明
printf
%(fmt)T
符仅在 Bash 4.2 中可用和较新的 - POSIX
read
没有这个-t
选项。 - 不能使用
sleep
或cat
其他非内置函数,因为它们会使用额外的 PID。
答案2
POSIX 不提供获取内核分配的最后一个 PID 的方法,因此无法提供可移植的答案。
这是一个 oneliner,应该适用于所有实现 dtrace 的系统(Solaris、FreeBSD、NetBSD、Mac OS X、带有最新 UEK 的 Oracle Linux,以及其他类似基于 Illumos 的操作系统、带有最新 UEK 的 Linux)dtrace4linux)
# dtrace -qn 'proc:::exec-success { printf("%Y - %d\n",walltimestamp,pid); }'
2013 May 15 00:48:47 - 1276
2013 May 15 00:48:49 - 1277
2013 May 15 00:48:52 - 1278
编辑:
在 Linux 上,另一种选择是使用系统水龙头如果可用,此命令(未经测试)应提供类似的输出:
# stap -e 'probe syscall.execve { printf("%s - %d\n",ctime(gettimeofday_s()),pid()); }'