カーネルに最後に割り当てられたPIDを監視する方法は?

カーネルに最後に割り当てられたPIDを監視する方法は?

プロセス生成を監視するために、カーネルが割り当てた最後の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で利用可能そして最新
  • POSIXreadそのようなオプションはありません-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()); }'

関連情報