web-dev-qa-db-ja.com

別のプロセスからstderrを取得したら、プロセスを再起動します

ローカルで収集されたデータをエンドポイントにPOSTする、この常時実行プロセスがあります。現在、raspberryPi Wi-Fiモジュールに問題があり、接続が頻繁に切断されます。ネットワークを再起動すると、再び機能し始めます。

これは、インターネットが切断されるたびにproc1がstderrをスローし始めるという顔に基づいて、私が今持っているものです。

while true; do
   ./proc1 2>&1 >/dev/null | Sudo /etc/init.d/networking restart
done &

しかし、このコードはネットワークを複数回再起動します。理由はわかりません。

私が実際に欲しいのは次のようなものです:

while true: 
   if proc1 has stderr: 
      Sudo /etc/init.d/networking restart; 
      sleep 10;

だから私の質問は:

  1. その擬似コードをbashに変換するにはどうすればよいですか?
  2. これは、ネットワークドロップの実際の問題を回避するためのハックですが、何が問題なのかをデバッグするにはどうすればよいですか?
4
zengr

更新

これははるかに簡単です:

( 
{ ${PROC1_CMD} >&3 } 2>&1 | 
    while : ; do 
        grep -q "YOUR ERROR MESSAGE" && ${YOUR_ACTION} 
    done
) 3>&2

基本的には、stdinstderr$PROC1_CMDに交換するだけなので、grepの出力を|pipe.に置き換えることができます。通常は可能ですが、stderrに書き込むとすぐに、望まないメッセージを$YOUR_ACTION.に送信できます。

2
mikeserv

ビジーポーリングは、特に何かをすぐに再起動する必要があるため、whileループ内でsleep()を使用できない状況では良くありません。

最善の方法は、OSが提供する構造に依存することです。シェルスクリプトなので、inotify-toolsを使用します: https://github.com/rvoicilas/inotify-tools/wiki

例は次の場所にあります: http://blog.lagentz.com/general/automate-your-Shell-scripts-using-inotify-and-inotifywait/

1
ernesto

WiFiの監視

これらは必ずしもBashソリューションではありませんが、これらのツールの多くを使用してプロセスを監視し、再起動しました。私はあなたがあなたのアプローチで間違ったことを監視しようとしていると思います。スクリプトからの出力を監視するのではなく、実際にはネットワークサービスを監視する必要があります。

これらのセットアップと使用について詳しくは、このU&L Q&Aのタイトルをご覧ください: 自動化された方法でサービスの適切な監視を設定する方法は?クラッシュした場合に自動的に再起動するようにする方法は?

私は、セットアップと使用が非常に簡単な神を好みます。 Rubyのインストールが必要ですが、他の1つがニーズに適している可能性があります。

その他のアプローチ

これがRaspPiの問題であることを考えると、実際にはこの問題に関連するスレッドがサイトにあります。そのスレッドからも使用できる多くの提案があります。スレッドのタイトルは次のとおりです。 ドロップ時にWifi再接続

1
slm