0

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

 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

我如何监控这个例程并在它死时重新启动它?

4

2 回答 2

6

如果你想跟随文件而不是描述符(这样你得到最新的文件,即使像logrotate在你下面移动它),你可以使用tail -F它基本上是:

tail --follow=name --retry

我通常做的是运行:

tail -F somefile 2>/dev/null

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

echo pax is a >somefile
rm somefile
echo wonderful person >somefile

你会看到这两行都出现在tail输出中。

使用该解决方案,该进程不应终止,因此无需重新启动它。

于 2012-12-02T09:53:30.937 回答
1

我建议你把你的脚本变成系统守护进程(例如,这里有一个提示如何在 Debian 下做到这一点),你也可以很好地记录和控制你的进程。

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

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

/path/to/my-script.sh给定代码的文件在哪里。

于 2012-12-02T10:01:42.133 回答