当我从另一个进程获取 stderr 时重新启动进程

当我从另一个进程获取 stderr 时重新启动进程

我有一个不断运行的进程,它将本地收集的一些数据发布到端点。现在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;

所以我的问题是:

  1. 如何将该伪代码转换为 bash?
  2. 这是一个解决网络掉线实际问题的 hack,我该如何调试问题所在?

答案1

更新

这更简单:

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

基本上我们只是交换stdinand stderrfor$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 掉线时重新连接

相关内容