他のプロセスから stderr を受け取ると、プロセスを再起動します。

他のプロセスから stderr を受け取ると、プロセスを再起動します。

ローカルで収集されたデータの一部をエンドポイントに公開する継続的に実行されるプロセスがあります。今raspberryPi Wi-Fiモジュールにいくつかの問題があり、しばしば接続が切断されます。ネットワークを再起動した後、再び動作を開始しました。

だから、これはインターネット接続が失われるたびにstderrを投げ始めるproc1に基づいています。

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. これは、ネットワーク切断の実際の問題を解決するためのハッキングです。問題をどのようにデバッグできますか?

答え1

修正する

これはもっと簡単です:

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

基本的に、私たちはプロセスが何を言いたいのかにかかわらず、この方法で出力できるようにstdinand stderrforを交換するだけです。通常は大丈夫ですが、不要なメッセージを作成したら、次のことができます。$PROC1_CMDgrep|pipe.stderr$YOUR_ACTION.

答え2

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

最善のアプローチは、オペレーティングシステムによって提供される構成に依存することです。シェルスクリプトなので、inotify-toolsが使用されます。https://github.com/rvoicilas/inotify-tools/wiki

例は以下にあります。 http://blog.lagentz.com/general/automate-your-shell-scripts-using-inotify-and-inotifywait/

答え3

WiFiモニタリング

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

このU&L Q&Aで設定と使用について詳しく学んでください。サービスを自動化された方法で適切に監視するにはどうすればよいですか?では、競合が発生すると自動的に再起動しますか?

私は神を好む。設定と使用が簡単すぎます。しかし、Rubyをインストールする必要があるので、他のものの1つがあなたのニーズに合うかもしれません。

他の方法

これがRasp Piの問題であることを考慮すると、実際にこの問題に関連するスレッドはRasp Piのウェブサイトにあります。このスレッドのさまざまな提案を使用することもできます。スレッドのタイトルは次のとおりです。Wi-Fiが切断された場合は再接続してください。

関連情報