web-dev-qa-db-ja.com

systemdはハングしたプロセスを検出して強制終了できますか?

ファイルロックを使用するソリューションに取り組んでいる間、コードがデッドロックに陥っていると思います。 systemdを使用して、システムの起動時にプロセスを開始します。 alarm(3)の使用はオプションですが、systemdがハングしたプロセスを検出して再起動する方法があるかどうか疑問に思っていましたか?

現在、この問題を回避するために、journalctlの出力を確認する予定です。それが指定された時間変化しない場合は、シェルスクリプトを使用してプロセスを強制終了します。

Systemdやその他の方法でプロセスを監視するより良い方法があるかどうか疑問に思っています。

16
freethinker

はい;しかし、systemdをいじる前に、まずバグのあるプログラムを修正します。

MariusMatutiaeはかなり正しいです。プログラムに問題があります。それはデッドロックです。 systemdをいじるのは答えではありません。せいぜい、気晴らしです。プログラムが壊れないように修正します。エネルギーを正しい方向に向けます。

とはいえ、本来の質問ではなく、質問のタイトルが理由で他の人々がここに来るでしょう。彼らの利益のために、適切な質問を無視して、タイトルへの答えはここにあります:

はい、systemdはデーモンを監視し、会話を停止した場合にデーモンを自動的に再起動できます。古いデーモンだけではありません。 mvpが注記しているように、デーモンがハングしたことを知る方法はありません(この宇宙では、停止の問題は少なくとも決定不可能です)。 systemdも他のコンピュータープログラムも、それらにスローされたランダムプログラムがデッドロックした、無限ループに陥ったなど、最初から推測することはできません。ここで得られる最善の方法は、デーモンが必要な時間内に通常の「ハートビート」操作を実行していないことを検出することです。

したがって、systemdのウォッチドッグ機能を利用するデーモンは、systemd固有のプロトコルであるsd_notifyプロトコルを話すように作成する必要があります。これはデーモンコードを少し複雑にします。デーモンは、適切に記述されている場合は、ウォッチドッグ機能を有効にして呼び出されているかどうかも確認する必要があるため、さらに複雑になります。

Systemdのウォッチドッグ機能を利用するためにこのプロトコルを話すデーモン…

  • WATCHDOG_USEC環境変数を確認する必要があります。
  • sd_notify()WATCHDOG=1オプションが設定された状態で、約WATCHDOG_USEC/2の間隔で継続的かつ頻繁に呼び出す必要があります(「USEC」はマイクロ秒を表します) );
  • …ユニットファイルで Type=notify を設定する必要があります。
  • …ユニットファイルに NotifyAccess=main (または=all)が設定されている必要があります。
  • WatchdogSec=seconds がユニットファイルに設定されている必要があります。
  • libsystemd-daemon.soとリンクする必要があります

これのコーディングの詳細を知りたい場合は、マニュアルを読んだ後、正しいStackExchangeに移動してください。これはSuperUserです。 StackOverflowは over there です。

参考文献

25
JdeBP