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


16

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

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

systemdまたはその他の方法でプロセスを監視するより良い方法があるかどうか疑問に思うだけです。


おそらくない。プロセスがハングしたかどうかをどのように確認しますか?本当に何か必要な場合はどうしますfor(;;) do_something();か?
mvp

4
厳密に言えば、コードがハングした場合、その問題をデバッグする必要があります。systemdを介してそれを殺す(それができると仮定すると、それは信じられない)、または他の方法でそれをデバッグするときに行うべき適切なことである。ただし、デッドロック状態に陥ることはありません。
MariusMatutiae

回答:


25

はい; 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=秒を設定する必要があります。
  • …とリンクする必要があります libsystemd-daemon.so

このコーディングの詳細を知りたい場合は、マニュアルを読んだ後、必ず正しいStackExchangeにアクセスしてください。これはスーパーユーザーです。StackOverflowはそこにあります。

参考文献


2
もちろん、問題を修正する必要があります。私の唯一の意図は、問題を理解するまで一時的なハックをすることでした。詳細な回答をありがとう。
freethinker
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.