ローカルで収集されたデータをエンドポイントに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;
だから私の質問は:
これははるかに簡単です:
(
{ ${PROC1_CMD} >&3 } 2>&1 |
while : ; do
grep -q "YOUR ERROR MESSAGE" && ${YOUR_ACTION}
done
) 3>&2
基本的には、stdin
とstderr
を$PROC1_CMD
に交換するだけなので、grep
の出力を|pipe.
に置き換えることができます。通常は可能ですが、stderr
に書き込むとすぐに、望まないメッセージを$YOUR_ACTION.
に送信できます。
ビジーポーリングは、特に何かをすぐに再起動する必要があるため、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/
これらは必ずしもBashソリューションではありませんが、これらのツールの多くを使用してプロセスを監視し、再起動しました。私はあなたがあなたのアプローチで間違ったことを監視しようとしていると思います。スクリプトからの出力を監視するのではなく、実際にはネットワークサービスを監視する必要があります。
これらのセットアップと使用について詳しくは、このU&L Q&Aのタイトルをご覧ください: 自動化された方法でサービスの適切な監視を設定する方法は?クラッシュした場合に自動的に再起動するようにする方法は? 。
私は、セットアップと使用が非常に簡単な神を好みます。 Rubyのインストールが必要ですが、他の1つがニーズに適している可能性があります。
これがRaspPiの問題であることを考えると、実際にはこの問題に関連するスレッドがサイトにあります。そのスレッドからも使用できる多くの提案があります。スレッドのタイトルは次のとおりです。 ドロップ時にWifi再接続 。