親プロセスが既知の場合、子プロセスの非常に短いIDを取得する方法は?

親プロセスが既知の場合、子プロセスの非常に短いIDを取得する方法は?

私はLinuxで短いサブプロセスのPIDを取得する方法を探しています。人間の観点から見ると、その過程は即時です。私は子プロセスを生成する親プロセスを知っています。

特定の親プロセスで生成されたすべてのプロセスに関する情報を記録する方法はありますか?

私は子供のPIDを遡って調べる方法ではなく、そのようなことが発生した後に記録する方法を探しています。

答え1

監査システムを使用できます。

sudo auditctl -a exit,always -S execve -F ppid="$pid"

$pid子プロセスがコマンドを実行するたびに監査エントリが生成されます。audit.log次のようなものがあります。

type=SYSCALL msg=audit(1373986729.977:377): arch=c000003e syscall=59 success=yes exit=0 a0=7ff000e4b188 a1=7ff000e4b1b0 a2=7fff928d47e8 a3=7fff928caac0 items=2 ppid=7502 pid=691 auid=10031 uid=10031 gid=10031 euid=10031 suid=10031 fsuid=10031 egid=10031 sgid=10031 fsgid=10031 ses=1 tty=pts5 comm="echo" exe="/bin/echo" key=(null)
type=EXECVE msg=audit(1373986729.977:377): argc=2 a0="/bin/echo" a1="test"
type=CWD msg=audit(1373986729.977:377):  cwd="/tmp"
type=PATH msg=audit(1373986729.977:377): item=0 name="/bin/echo" inode=131750 dev=fe:00 mode=0100755 ouid=0 ogid=0 rdev=00:00

pidそこから他のものを見つけることができます。

特定のタスクを実行する必要がないプロセスに興味がある場合と、forkシステムコールのclone監査ルールを追加できます。

答え2

[この回答は以下からインスピレーションを得ました。amsコンサルティング]

子プロセスが別の実行可能ファイル(私たちはこれと呼ばれるfoo)の場合は、シェルラッパーを試してみてください。

元の実行可能ファイルの名前を変更します。

$ cd \path\to\foo\
$ mv foo foo.moved

ラッパーを次のように作成しますfoo

#!/bin/sh
\path\to\foo\foo.moved "$@" &
FOO_PID=$!
echo $FOO_PID >\tmp\foo.pid

実行可能にする:

chmod +x foo

次回プログラムが実行されたときにpidを取得できます\tmp\foo.pid

答え3

シェル方式

$!シェルでコマンドを実行すると、Bashシェルの特殊変数を使用して、バックグラウンドで実行されている最後のプロセスのPIDを見つけることができます。

たとえば、

$ sleep 5 &
$ echo $!
8648

また、プロセスをバックグラウンドに設定すると、プロセスのPIDは次のようにコンソールを介して返されます。

$ sleep 5 &
[1] 8648    

別の方法は次のpgrep -P <PPID>とおりです。

# PID of bash shell
$ echo $$
8376

# run fake job
$ sleep 120 &
[1] 8891

# pgrep PPID
$ pgrep -P 8376
8891

ウォールグリーン

子PIDを取得したいプログラムを実行する前に、以下を注入する方法は他にもあります。

$ valgrind --trace-children=yes <cmd>

たとえば、

# sample.bash
#/bin/bash

ls

$ valgrind --trace-children=yes ./sample.bash
...
==17734==      possibly lost: 0 bytes in 0 blocks
==17734==    still reachable: 33,606 bytes in 95 blocks
==17734==         suppressed: 0 bytes in 0 blocks
==17734== Rerun with --leak-check=full to see details of leaked memory
==17734== 
==17734== For counts of detected and suppressed errors, rerun with: -v
==17734== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 6 from 6)
==17733== 
==17733== HEAP SUMMARY:
==17733==     in use at exit: 36,409 bytes in 879 blocks
...

17733はPPID、PID 17734はlsget()を呼び出した子PIDです。

答え4

オペレーティングシステム(o / pで指定されていない)がプロセストレースをサポートしていない場合は、新しいプロセスが新しいイメージをロードすると仮定し、サブイメージをラッパーに置き換えることを検討してください。

関連情報