7

組み込みLinuxを実行しているシステムがあり、継続的に実行することが重要です。基本的には、センサーと通信し、そのデータをデータベースとWebクライアントに中継するためのプロセスです。

クラッシュが発生した場合、アプリケーションを自動的に再起動するにはどうすればよいですか?

また、ポーリングを実行するスレッドがいくつかあります(ソケットやUART通信など)。どのスレッドもハングしたり、予期せず終了したりしないようにするにはどうすればよいですか?スレッドに優しい使いやすいウォッチドッグはありますか?

4

4 に答える 4

7

この回答でfork説明waitpidされているように、プロセスが終了したときに、プロセスをシームレスに再開できます。OSがメモリページを共有するため、大きなリソースは必要ありません。

これは、ハングしたプロセスを検出するという問題だけを残します。これには、Michael Aaron Safyanが指摘した任意のソリューションを使用できますが、さらに簡単なソリューションは、alarmsyscallを繰り返し使用して、シグナルでプロセスを終了させることです(それに応じてsigactionを使用します)。呼び出し続ける限りalarm(つまり、プログラムが実行されている限り)、プログラムは実行され続けます。そうしないと、信号が発火します。
そうすれば、追加のプログラムは必要なく、ポータブルPOSIXのものだけが使用されます。

于 2011-09-11T22:28:32.643 に答える
6

その要点は次のとおりです。

  1. プログラムがまだ実行中であり、ハングしていないかどうかを検出する必要があります。
  2. プログラムが実行されていないか、ハングしている場合は、プログラムを(再)起動する必要があります。

#1を実行するにはさまざまな方法がありますが、頭に浮かぶのは次の2つです。

  1. UNIXドメインソケットをリッスンして、ステータス要求を処理します。次に、外部アプリケーションは、アプリケーションがまだ問題ないかどうかを問い合わせることができます。タイムアウト期間内に応答がない場合は、クエリ対象のアプリケーションがデッドロックしているか、デッドであると見なすことができます。

  2. 事前に選択されたパスでファイルに定期的にアクセスします。外部アプリケーションはファイルのタイムスタンプを調べることができ、ファイルが古くなっている場合は、アプリケーションが停止しているかデッドロックしていると見なすことができます。

#2に関しては、以前のPIDを強制終了し、fork+execを使用して新しいプロセスを起動するのが一般的です。また、「継続的に」実行されるアプリケーションを1回実行するアプリケーションにすることを検討することもできますが、その後、「cron」またはその他のアプリケーションを使用して、その単一実行アプリケーションを継続的に再実行します。

残念ながら、ウォッチドッグタイマーとデッドロックからの脱却は重要な問題です。私はそれを行うための一般的な方法を知りません、そして私が見たいくつかはかなり醜く、100%バグがないわけではありません。ただし、tsanは、静的分析で潜在的なデッドロックシナリオやその他のスレッドの問題を検出するのに役立ちます。

于 2011-09-11T06:07:23.817 に答える
1

CRONジョブを作成して、プロセスがstart-stop-daemonで実行されているかどうかを時々確認できます。

于 2012-06-06T18:40:31.460 に答える
1

このスクリプトを使用してアプリケーションを実行します

#!/bin/bash

while ! /path/to/program   #This will wait for the program to exit successfully.
do
echo “restarting”                  # Else it will restart.
done

このスクリプトを/etc/init.d/他のスクリプトに配置して、デーモンとして起動することもできます

于 2017-04-21T11:39:09.450 に答える