如何监控内核最后分配的PID?

如何监控内核最后分配的PID?

为了监视进程创建,我想定期将内核分配的最后一个 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

问题:

答案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()); }'

相关内容