0

C で記述したアプリケーションを Linux デバイス サーバーで実行しています。アプリケーションがクラッシュまたはハングした場合、システムを再起動したいと考えています。デバイス サーバーには、この機能を実装していると思われるサンプル アプリが付属していましたが、よくわかりません。この機能を実装していると思われるものを取り出して、次のスケルトンを作成しました。

int terminate=0;

int main () {

  struct sigaction     sigact;

  sigact.sa_handler = sighandler;
  sigemptyset(&sigact.sa_mask);
  sigact.sa_flags = 0;
  sigaction(SIGTERM,&sigact,0); 

  while (terminate == 0) 
  {
    // my main application functions
  }

  SDK_reboot();  // reboots my device server

}

void sighandler(int sig)
{
  if (sig == SIGTERM)
    terminate = 1;
}

基本的に、上記のコードで何が起こっているのかを理解し、必要に応じてコードを変更して、ニーズを満たすようにしたいと考えています。Is 'sigaction(SIGTERM,&sigact,0);' アプリケーションのハングまたはクラッシュに応答して SIGTERM が発生する原因となる行は? いいえの場合、正しいコードは何ですか? また、一般的に、上記はアプリケーションのクラッシュ/ハング時に再起動を実装する良い方法ですか? それとも私は軌道から外れていますか?よろしくお願いします。

4

2 に答える 2

0

いいえ、SIGTERM ではなく SIGCHLD です。つまり、メインのフォークされた子プロセスの 1 つが終了すると、ループは終了します。

これは、実際の「ワーカー プロセス」をフォークし、終了すると再起動するアプリケーションの一部のように見えます。注:ハングは終了しません。これは、無限ループやその他のハングを検出しません。

于 2012-09-24T16:35:43.227 に答える
0

ボードを再起動する最も確実な方法は、ハードウェア ウォッチドッグ タイマーを使用することです。このソリューションは、アプリケーションのクラッシュとハングを効率的に検出します。

組み込み Linux カーネルには通常、ウォッチドッグ ドライバー (/dev/watchdog) が含まれています。ウォッチドッグ サポートを有効にしてカーネルを再構築します。

アプリケーション内で /dev/watchdog を開き、カーネルがリセットされないように、少なくとも 1 分に 1 回は書き込みを続けます。書き込みごとに、再起動時間がさらに 1 分遅れます。非アクティブ状態が 1 分間続くと、ウォッチドッグ ハードウェアがリセットを引き起こします。( http://linux.die.net/man/8/watchdogを参照)

コードを参照すると、アプリケーションが起動したらすぐに /dev/watchog を開き、while ループ内で書き込むことができます。これは、アプリケーションにスレッドが 1 つしかない場合に当てはまります。スレッド数が多い場合は、もう少しトリッキーなものを考え出す必要があります。

アプリケーションのクラッシュを検出する方法もあります。主なアイデアは、そのソリューションと同じです: https://superuser.com/questions/223449/auto-restart-process-on-crash。スクリプトは C で書き直すことができます。これには、fork()、execve()、waitpid() の使用が含まれます。

于 2012-09-24T21:46:55.653 に答える