我有一个不断运行的进程,它将本地收集的一些数据发布到端点。现在raspberryPi wifi模块出现一些问题,经常断开连接。重新启动网络后,它再次开始工作。
所以这就是我现在所拥有的基于每次互联网断开连接时,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;
所以我的问题是:
- 如何将该伪代码转换为 bash?
- 这是一个解决网络掉线实际问题的 hack,我该如何调试问题所在?
答案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() 的情况。
最好的方法是依赖操作系统提供的构造。由于它是一个 shell 脚本,因此使用 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 问答中了解有关其设置和使用的更多信息:如何以自动化的方式对我的服务进行适当的监控?那么,如果发生崩溃,它会自动重新启动吗?。
我偏爱上帝,它非常容易设置和使用。但它确实需要安装 Ruby,因此其他之一可能更适合您的需求。
其他方法
鉴于这是 Rasp Pi 问题,他们的网站上实际上有一个与此问题相关的线程。您也可以从该线程中使用许多建议。该线程的标题是:Wifi 掉线时重新连接。