プロセスを実行しています。このプロセスから、別のプロセスの終了の通知を受け取りたいと思います。Windowsでは、WaitForSingleObjectを使用できます。これは、処理対象のプロセスのハンドルを渡すことによって実行されます。Linuxの世界は初めてですが、いくつかのアプローチを提案してください。
5 に答える
監視対象をチェックする価値があるかもしれません
Linux(および実際にはほとんどの* NIXen)では、root権限(または一般的なトレースを可能にする効果的な機能-これは完全なrootを付与せずに機能システムを介して調整できます)を持っていない限り、現在のプロセスの子であるプロセスのみを待つことができますアクセスしますが、意識的に構成する必要があります...)、ptrace()
任意のプロセスに接続してそれらを監視するために使用できます。
これを行うために使用できるLinuxAPIは複数あります。それらのいくつかを次に示します。
- Netlinkプロセスコネクタ-これはあなたが望むことを正確に行うためのAPIですが、詳細情報の短期間のプロセスを追跡する際に問題があります
- 監査API-ほとんどのディストリビューションでデフォルトで有効になっているカーネルAPIで、すべてのシステムコールのユーザーモードにイベントを送信できます(このルートを使用する場合は、execのようなシステムコールとフォークのようなシステムコールを追跡する必要があります)
- tracepointsとkprobes-プロセスのライフサイクルに関するイベントに関する情報を取得するために使用できる2つのカーネルデバッグAPI
- ebpfベースのソリューション-tracepoints/kprobesと組み合わせて使用して、カーネル内のイベントをフィルタリングしたり、さまざまなロジックを実行したりできます
- ptraceベースのソリューション-これらには、単純なptraceデバッグとseccompAPIが含まれます
1つのStackOverflowの回答でこれらのオプションを適切に比較するには詳細が多すぎますが、これについてはブログに詳しく書いています。
子プロセス内で子プロセスのプロセスIDを取得できる場合は、それを子プロセス内のファイルに保存し、そこから親プロセスで読み取ることができます。次に、親プロセスでps ax | cut -b 1-5 | grep fooprocessid
、一定の間隔で子プロセスの存在をポーリングできます。より洗練されたメソッドは確かに存在しますが、これはどのプログラミング言語でも機能します。子プロセスではプロセスIDを取得でき、親プロセスではコマンドを実行できます。
ps
(または)で見つけることができtop
、子プロセスを他のすべてのプロセスと区別する詳細を知っている場合は、子プロセスのプロセスIDでさえ必要ありませんps ax | grep foo
。またはps
、子プロセスについて知っている詳細に応じて、他のパラメータを使用します。
最新のLinux(カーネルバージョン5.3以降)には、プロセスIDを、、、およびその他の機能とpidfd_open
互換性のあるハンドルにラップできるカーネルAPIがあります。poll
epoll