我有一个简单的要求,就是不断监视日志文件,当其中出现某些术语时,发送一条JMS消息。我使用了下面的代码(checkScript.sh),它可以完美地工作到午夜,这时归档脚本开始工作。
string="requiredstring"
tail -n 0 -f /home/user/log.log | \
while read LINE
do
echo "$LINE" | grep -q $string
java tibjmsProducer -server tcp://localhost:7222 -user admin -password admin -queue test.queue "$LINE"
done午夜时分,有一个归档脚本启动log.log文件并将其重命名为log.log.1并触及log.log文件。因此,我们将得到两个文件log.log和log.log.1。由于AIX不能使用tail监视这些文件更改,因为AIX中的尾部只跟踪文件描述符,所以我编写了另一个脚本,它将在归档完成后重新启动上面的代码。
kill -9 `ps -ef|grep "tail -n 0 -f" | grep "checkScript"| awk '{print $2}'`
echo "Killed process. Restarting the shell script"
./checkScript.sh >> /home/user/Service.log 2>&1 &有趣的是,它确实完全按照预期工作。但是在重新启动后,日志文件将停止监视,并且不会触发任何事件,但脚本上的ps -ef显示checkScript正在运行尾部。
我做错什么了吗?
谢谢!
发布于 2014-11-30 16:02:31
我建议先使用cp,然后使用cat /dev/null,而不是盲目地重命名(这将保留相同的inode,并允许原始进程继续执行而不会中断)。另外,我建议您使用date命令。就像这样
#!/bin/sh
DT=`date "+%Y%m%d%H%M%S"`
LF="/home/user/log.log"
FN="$LF-$DT"
cp "$LF" "$FN"
cat /dev/null > "$LF"最后,您可以考虑添加(假设您有bzip2)
bzip2 -9 "$FN"发布于 2014-12-01 20:57:35
哈!最后,一个简单的(适当的)谷歌给出了这个愚蠢问题的解决方案。我忘记提到的是(我认为这无关紧要),我的脚本被crontab重新启动。而且cron运行时使用的是一组不包括Java目录的环境变量。因此,当脚本运行时,它不会将结果推送到JMS服务器。
为了解决这个问题,我已经像下面这样修改了重启脚本,它就像一个护身符!
. ${HOME}/.profile
kill -9 `ps -ef|grep "tail -n 0 -f" | grep "checkScript"| awk '{print $2}'`
echo "Killed process. Restarting the shell script"
./checkScript.sh >> /home/user/Service.log 2>&1 &这为我加载了所有正确和必需的路径,脚本现在工作得很好。. ${HOME}/.profile命令帮助解决了脚本中的依赖关系,从现在开始,我将在我将要编写的所有crontab脚本中使用它。谢谢!
https://stackoverflow.com/questions/27211229
复制相似问题