その要点は次のとおりです。
- プログラムがまだ実行中であり、ハングしていないかどうかを検出する必要があります。
- プログラムが実行されていないか、ハングしている場合は、プログラムを(再)起動する必要があります。
#1を実行するにはさまざまな方法がありますが、頭に浮かぶのは次の2つです。
UNIXドメインソケットをリッスンして、ステータス要求を処理します。次に、外部アプリケーションは、アプリケーションがまだ問題ないかどうかを問い合わせることができます。タイムアウト期間内に応答がない場合は、クエリ対象のアプリケーションがデッドロックしているか、デッドであると見なすことができます。
事前に選択されたパスでファイルに定期的にアクセスします。外部アプリケーションはファイルのタイムスタンプを調べることができ、ファイルが古くなっている場合は、アプリケーションが停止しているかデッドロックしていると見なすことができます。
#2に関しては、以前のPIDを強制終了し、fork+execを使用して新しいプロセスを起動するのが一般的です。また、「継続的に」実行されるアプリケーションを1回実行するアプリケーションにすることを検討することもできますが、その後、「cron」またはその他のアプリケーションを使用して、その単一実行アプリケーションを継続的に再実行します。
残念ながら、ウォッチドッグタイマーとデッドロックからの脱却は重要な問題です。私はそれを行うための一般的な方法を知りません、そして私が見たいくつかはかなり醜く、100%バグがないわけではありません。ただし、tsanは、静的分析で潜在的なデッドロックシナリオやその他のスレッドの問題を検出するのに役立ちます。