web-dev-qa-db-ja.com

/ etc / inittabはすでに実行中のプロセス、Debian9をリスポーンします

バイナリをリスポーンするために/etc/inittabにアントリーを追加しました。エントリは次のようなものです。

id:2:respawn:/path-to-my-bin

次に、init qを実行すると、プロセスはinittabによって開始されます。プロセスを強制終了すると、再生成されます。

問題

次の操作を行うと、奇妙な動作が発生します。

  1. 手動で/path-to-my-binaryを実行します
  2. 上記のエントリを/etc/inittabに追加します
  3. init qを実行します

結果:プロセスはすでに実行されていても、再生成されます。

さらに、バイナリがinit.dで起動時に実行されるように設定されている場合、ランレベル2では、inittabは起動時にすぐにバイナリを再生成します。

2

簡単な答えは次のとおりです。このようにしないでください。

/etc/inittabの構成に従ってプロセスを処理する場合は、手動または他の場所でプロセスを開始しないでください。

initは、プロセスのコマンドとinittabのエントリの間に一致がある場合、既存のプロセスをチェックしません。子、つまりinit自体によって開始されたプロセスのみを監視します。
init qを実行すると、initプロセスは、ラインid:2:respawn:/path-to-my-binのプロセスを(まだ)開始していないことを認識し、開始します。


残念ながら、これが明示的に指定されている場所はわかりません。
私にとっては、いくつかの理由でこの方法でなければならないことは明らかです:

  1. initは、子プロセスが終了するとシグナルを受け取るため、プロセスのステータスを取得し、inittabから仕様を確認し、必要に応じてプロセスを再開できます。これはイベントベースです。無関係なプロセスの場合、これは不可能であるため、initはすべてのプロセスをチェックする必要があります。これはおそらくポーリングでしょう。
  2. initは、inittab行の1つと同じコマンドを実行する別のプロセスの意図がわからない。プロセスの2番目のインスタンスを実行することが望ましい動作である場合とそうでない場合があります。
  3. initinitに従ってインスタンスをすでに開始した後でプログラムを手動で開始した場合、inittabは何を期待しますか? inittabによって開始されたプロセスが後で終了する場合はどうなりますか?または、他のプロセスが後で終了した場合はどうなりますか?

多くの未解決の質問があるので、initがその子プロセスのみを処理し、無関係なプロセスを無視するのは当然です。

2
Bodo