現在実行中のプロセスから分岐したプロセスのリストを取得しますか?

現在実行中のプロセスから分岐したプロセスのリストを取得しますか?

私はbashスクリプト用のラッパーアプリケーションを作成していますが、アプリケーションはユーザースクリプトで開始されたツール/プロセスを追跡したいと思います。生成されたサブプロセスのリストを決定する最良の方法が何であるかを知りたいです。これ親プロセス。

頑張った

  1. 定期的に電話するメモコマンドを実行してプロセスツリーを構築します(例:ps -ejH)、すぐに完了するまで実行されるプロセスがありません。
  2. 次のツールを使用してください。キツネの塔proc コネクタインタフェースを使用しますが、高い特権でのみ実行できます。これは正しいデータを提供しますが、私の場合はsudoで実行が機能しませんか?

これを達成する方法について提案がありますか?

答え1

straceLinuxを使用している場合は、プロセスで使用されているシステムコールを追跡するために使用できます。たとえば、

~ strace -e fork,vfork,clone,execve -fb execve -o log ./foo.sh
foo bar
~ cat log
4817  execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4818
4818  execve("/bin/true", ["/bin/true"], [/* 42 vars */] <detached ...>
4817  --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4818, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4819
4817  clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7f1bb563b9d0) = 4820
4820  execve("/bin/echo", ["/bin/echo", "foo", "bar"], [/* 42 vars */] <detached ...>
4817  --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=4820, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
4817  +++ exited with 0 +++
4819  execve("/bin/sleep", ["sleep", "1"], [/* 42 vars */] <detached ...>

スクリプトはシステムコールを使用して3つのプロセス(PID 4818、4819、4820)を分岐clone(2)し、execve(2)これらの分岐プロセスのシステムコールが実行されたコマンドを表示することがわかります。

  • -e fork,vfork,clone,execveトレース出力をこれらのシステムコールに制限する
  • -f子プロセスに従う
  • -b execve到達するとプロセスから分離されるため、execve子プロセスのトレースは表示されなくなります。

答え2

pstree -p `pgrep NetworkManager`
NetworkManager(1638)─┬─dhclient(3594)
                     ├─{NetworkManager}(1645)
                     ├─{NetworkManager}(1647)
                     └─{NetworkManager}(7363)

私はこれがあなたが探しているものだと思います。

直接pidまたはpgrepとプロセス名を使用してください。

-pは子プロセスのpidを印刷するために使用されます。

答え3

パッケージコマンドが役に立ちます。次のコマンドを使用します。

process()から分岐した各プロセスのPIDを印刷します$pid

pgrep -P $pid

分岐した各プロセスの詳細については、次のコマンドを使用してください。

ps -fp `pgrep -P $pid`

$pidプロセスIDはどこにありますか?

答え4

この親プロセスによって生成された子プロセスのリストを決定する最善の方法は何ですか?

bashで書いたと仮定します(話しませんでした)。その後、ジョブ制御を使用できます。この機能は、スクリプトの実行時にデフォルトでオフになっています。

Bashのマニュアルは次のように言います:

[--abefhkmnptuvxBCHP] [-o オプション] [arg...]
...
-m モニタモードを設定します。
ジョブ制御が有効になりました。このオプションは、それをサポートするシステムの対話型シェルに対してデフォルトで有効になっています(上記のタスク制御を参照)。バックグラウンドプロセスは別のプロセスグループで実行され、完了すると終了ステータスを含む行を印刷します。

したがって、スクリプトに追加すると、set -mstartコマンドを使用してcommand &からを使用してjobsタスクを一覧表示できます。

関連情報