バイナリをリスポーンするために/etc/inittab
にアントリーを追加しました。エントリは次のようなものです。
id:2:respawn:/path-to-my-bin
次に、init q
を実行すると、プロセスはinittab
によって開始されます。プロセスを強制終了すると、再生成されます。
次の操作を行うと、奇妙な動作が発生します。
/path-to-my-binary
を実行します/etc/inittab
に追加しますinit q
を実行します結果:プロセスはすでに実行されていても、再生成されます。
さらに、バイナリがinit.d
で起動時に実行されるように設定されている場合、ランレベル2では、inittab
は起動時にすぐにバイナリを再生成します。
簡単な答えは次のとおりです。このようにしないでください。
/etc/inittab
の構成に従ってプロセスを処理する場合は、手動または他の場所でプロセスを開始しないでください。
init
は、プロセスのコマンドとinittab
のエントリの間に一致がある場合、既存のプロセスをチェックしません。子、つまりinit
自体によって開始されたプロセスのみを監視します。init q
を実行すると、init
プロセスは、ラインid:2:respawn:/path-to-my-bin
のプロセスを(まだ)開始していないことを認識し、開始します。
残念ながら、これが明示的に指定されている場所はわかりません。
私にとっては、いくつかの理由でこの方法でなければならないことは明らかです:
init
は、子プロセスが終了するとシグナルを受け取るため、プロセスのステータスを取得し、inittab
から仕様を確認し、必要に応じてプロセスを再開できます。これはイベントベースです。無関係なプロセスの場合、これは不可能であるため、init
はすべてのプロセスをチェックする必要があります。これはおそらくポーリングでしょう。init
は、inittab
行の1つと同じコマンドを実行する別のプロセスの意図がわからない。プロセスの2番目のインスタンスを実行することが望ましい動作である場合とそうでない場合があります。init
がinit
に従ってインスタンスをすでに開始した後でプログラムを手動で開始した場合、inittab
は何を期待しますか? inittab
によって開始されたプロセスが後で終了する場合はどうなりますか?または、他のプロセスが後で終了した場合はどうなりますか?多くの未解決の質問があるので、init
がその子プロセスのみを処理し、無関係なプロセスを無視するのは当然です。