プロセス生成を監視するために、カーネルが割り当てた最後のPIDを定期的に書きたいと思います。どのファイルタイムスタンプを持つシステムのプロセス(PIDモニターによって生成されたプロセスだけでなく)(追加プロセスの生成を防ぐためにデーモンを使用)、どの言語でも可能ですが、POSIXシェルではこれが可能であると思います。
答え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
。 - 追加のPIDを使用しているため、内蔵されていない機能は
sleep
使用できません。cat
答え2
POSIXはカーネルが最後に割り当てたPIDを取得する方法を提供していないため、移植可能な回答を提供することはできません。
これは、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()); }'