로컬에서 수집된 일부 데이터를 엔드포인트에 게시하는 지속적으로 실행되는 프로세스가 있습니다. 이제 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;
그래서 내 질문은 다음과 같습니다
- 이 의사 코드를 bash로 어떻게 변환할 수 있나요?
- 이는 네트워크 연결 끊김의 실제 문제를 해결하기 위한 해킹입니다. 문제를 어떻게 디버깅할 수 있나요?
답변1
고쳐 쓰다
이것은 더 간단합니다:
(
{ ${PROC1_CMD} >&3 } 2>&1 |
while : ; do
grep -q "YOUR ERROR MESSAGE" && ${YOUR_ACTION}
done
) 3>&2
기본적으로 우리는 프로세스가 무엇을 말하고 싶어하든 이런 방식으로 출력 할 수 있도록 stdin
and stderr
for를 교체하기만 하면 됩니다. 일반적으로 괜찮지만 일단 원하지 않는 메시지를 작성한 후에는 다음을 수행할 수 있습니다.$PROC1_CMD
grep
|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가 끊어지면 다시 연결하세요..