私はbashスクリプト用のラッパーアプリケーションを作成していますが、アプリケーションはユーザースクリプトで開始されたツール/プロセスを追跡したいと思います。生成されたサブプロセスのリストを決定する最良の方法が何であるかを知りたいです。これ親プロセス。
頑張った
- 定期的に電話するメモコマンドを実行してプロセスツリーを構築します(例:ps -ejH)、すぐに完了するまで実行されるプロセスがありません。
- 次のツールを使用してください。キツネの塔proc コネクタインタフェースを使用しますが、高い特権でのみ実行できます。これは正しいデータを提供しますが、私の場合はsudoで実行が機能しませんか?
これを達成する方法について提案がありますか?
ベストアンサー1
strace
Linuxを使用している場合は、プロセスで使用されているシステムコールを追跡するために使用できます。たとえば、
~ 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
子プロセスのトレースは表示されなくなります。