如何在程序死后重新启动它

时间:2012-12-02 09:42:58

标签: bash process

我正在编写一些像这样的监控程序:

 tail -f /var/log/router-home.log | while read line ; do
   echo "$line" | egrep "MTF_SIP" | cut -b 28- | sed -u 's/#012/\n/g' \
   | egrep "IPP-->Received Event|rvCCConnMdmNewDigitCB|rvCCCallHandleOutOfBandDTMF" \
   | cut -d " " -f 15
 done > /tmp/phone/status &

但每次logrotation出现时都会更改/var/log/router-home.log查看进程 在这个例程中有一个以上我只能通过执行ps -e|grep tail

来检查它的状态

如何监控此例程并在死亡时重新启动它?

2 个答案:

答案 0 :(得分:6)

如果你想关注文件 name 而不是描述符(所以你得到最新的文件,即使像logrotate这样的东西在你下面移动它),你可以使用{{1}这基本上是:

tail -F

我通常做的是跑步:

tail --follow=name --retry

所以当文件更改时我没有看到错误消息。您可以通过确保tail -F somefile 2>/dev/null 不存在然后运行该命令来尝试此操作。然后,从另一个会话:

somefile

,您会看到这两行显示在echo pax is a >somefile rm somefile echo wonderful person >somefile 输出中。

使用该解决方案,进程不应该死亡,因此不需要重新启动它。

答案 1 :(得分:1)

我建议你把脚本变成系统守护进程(例如,here是一个提示如何在Debian下进行此操作),你也可以很好地记录和控制你的进程。

你也可以简单地trap所需的信号(可能是SIGHUP?)而不是退出,重新打开日志文件(重启你的过程)。

trap ". /path/to/my-script.sh" SIGHUP

其中/path/to/my-script.sh是包含给定代码的文件。