特定のプロセスが長期実行バックグラウンドプロセスAであると仮定します。プロセスAが始まるとすぐにpidを取得してタスクを実行するなど、bashスクリプトコマンド/スクリプトフックを実行したいと思います。私のユースケースの問題は、プロセスAが開始されるタイミング/方法を制御できず、プロセスAを変更してpidfileを生成できないことです。
現在、プロセスAは複数回実行できるため、プロセスAに関連付けられた複数のPIDがある可能性があります。スクリプトフックは、最初と同様にプロセスAのすべてのインスタンスで実行する必要があります。
私はプロセスAのすべてのインスタンスを取得するためにcronとpgrepを使ってみました。ただし、この方法はcronの最小ポーリング間隔であるため、60秒の遅延があります。
私の質問:
- 新しいプロセスAが開始され、プロセスAのbashフックが確実に実行されるたびに、ほぼリアルタイムの通知(5秒未満の遅延が許可され、低いほど良い)を達成するためにどのようなオプションが必要ですか?
- 低レイテンシ(例:1〜5秒のスリープ)でbgで無限のwhileループ+ pgrepを実行するのは安全なオプションですか?
- inotifyがファイルイベントに存在するため、特定のプロセスイベント(開始/終了/proc状態の変更など)を受信(+ cmdフック実行)する同様のメカニズムはありますか?
ありがとうございます!
答え1
信頼できる唯一の解決策は、ラッパースクリプトを介してプログラムを実行する準備をすることです。これを行うにはいくつかの方法がありますが、それらのどれも機能しないことはまれです。
- ラッパーを実行するためにこのプログラムを呼び出すプログラムを構成または変更します。
- に同じ名前のラッパーを配置します
$PATH
。 - プログラムの名前を変更し、ラッパーに元の名前を付けます。
このアプローチを使用すると、ラッパーが実行され、必要に応じて実際のプログラムを実行する前に準備する機会が保証されます。ラッパーは実際のプログラムの親プロセスでもあり、プログラムが終了したときに確実に通知され、終了ステータスを取得できます。
あなたはそれを使用することができますロギングファイルシステムファイルシステムのイベントを監視します。バラよりLoggedFS 構成ファイルの構文設定ファイルのドキュメントです。loggedfs
実行可能ファイルを含むディレクトリを指します。これを持っているか、Loggedfsをrootとして実行する必要があります。ファイルが実行されるたびにopen
イベントが発生し、そのプロセスのPIDを取得できます。open
ファイルを読み取るために開くと、イベントも発生します。 LoggedFSのみを使用すると、実行イベントを区別できないようです。プロセスが終了すると、release
イベントが生成されます。監視コードの実行中にプロセスが終了する可能性があります。
Linuxでは、次のものを使用できます。inotify待つ実行可能ファイルまたはイベントを待ちますaccess
。ファイルが実行されるたびにイベントが発生し、プロセスが終了するとイベントが発生します。この方法ではプロセスIDを取得できないため、ファイルが開いているプロセス(または使用など)を見つけて、ファイルを実行しているプロセスをフィルタリングする必要があります。close_nowrite
inotifywait -m -e access,close_nowrite --format=%e /bin/ls
access
close_nowrite
fuser
lsof
Linuxには、イベント(特定のファイルの実行など)を監視し、イベントを発生させたPIDを報告するためのより正確なツールである監査サブシステムもあります。バラよりコマンドライン引数を含むすべての実行されたコマンドを記録する簡単な方法はありますか?。その後利用できますアウディSPD監査イベントが発生したら、カスタムプログラムを実行します。ただし、これらはすべてルートアクセスを必要とし、ルートの場合は実行可能ファイルを置き換えることができますが、これは必要ありません。