다른 프로세스에서 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를 설치해야 하므로 다른 것 중 하나가 귀하의 요구에 더 잘 맞을 수도 있습니다.

다른 방법

이것이 Rasp Pi 문제라는 점을 고려하면 실제로 이 문제와 관련된 스레드가 Rasp Pi 웹사이트에 있습니다. 이 스레드의 다양한 제안을 사용할 수도 있습니다. 스레드 제목은 다음과 같습니다.Wi-Fi가 끊어지면 다시 연결하세요..

관련 정보