2011-09-11 12 views
5

システムが組み込まれたlinuxを実行していて、それが継続的に動作することが重要です。基本的には、センサーと通信してそのデータをデータベースおよびWebクライアントにリレーするプロセスです。クラッシュ時にLinuxが自動的にアプリケーションを再起動する - デーモン

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

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

答えて

6

それの要旨は次のとおりです。

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

あり#1を行うには、いくつかの異なる方法がありますが、気になる2は、以下のとおりです。

  1. は、ステータス要求を処理するために、UNIXドメインソケットに聞きます。外部アプリケーションは、アプリケーションがまだ正常かどうかを問い合わせることができます。タイムアウト期間内に応答がない場合、照会されているアプリケーションがデッドロックしているか、またはデッドしているとみなすことができます。

  2. 事前に選択したパスでファイルを定期的にタッチします。外部アプリケーションはファイルのタイムスタンプを見ることができ、失効している場合は、アプリケーションがデッドまたはデッドロックしていると見なすことができます。

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

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

+0

どれを開始するために他のあなたの/etc/init.d/にこのスクリプトを置くことができ、アプリケーション実行しているため、このスクリプト? – user623879

+1

多くの組み込みプラットフォームでは、ウォッチドッグデーモンがハードウェアウォッチドッグをプロンプトしてウォッチドッグが死ぬことがないようにすることができます – Hasturkun

+0

「アプリケーションを1回だけ実行するように調整してから、アプリケーションを繰り返し実行してください。これが可能であれば、検出プロセスを大幅に簡略化します。 –

6

forkwaitpidで終了するプロセスは、in this answerとシームレスに再起動できます。 OSがメモリページを共有するため、大きなリソースは必要ありません。

これは、ハングしたプロセスを検出する問題のみを残す。 Michael Aaron Safyanが指摘している解決策のどれかを使用することができますが、より簡単な解決法は、シグナルをプロセスを終了させて​​(それに応じてsigactionを使用して)、alarm syscallを繰り返し使用することです。 alarm(つまり、プログラムが実行されている限り)呼び出しを続ける限り、プログラムは実行され続けます。一度覚えていないと、信号が発せられます。
そのようにすれば、余分なプログラムは必要なく、移植可能なPOSIXのものだけが使用されます。

1

あなたは、プロセスが随時スタート・ストップ・デーモンで実行されているかどうかを確認するためにcronジョブを作成することができます。

0

使用

#!/bin/bash 

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

あなたも笑デーモンを見て、それらを再起動するボックスデーモンのうち、デーモンとして

関連する問題