我有一个java程序经常因.log文件中记录的错误而停止。什么是一个简单的shell脚本来检测最后/最后一行中的特定文本说
[INFO] Stream closed
然后运行以下命令
java -jar xyz.jar
这应该永远发生(可能每两分钟左右)因为xyz.jar
写日志文件。
文本stream closed
可以在日志文件中多次到达。我只是希望它在最后一行中采取行动。
答案 0 :(得分:1)
怎么样
while [[ true ]];
do
sleep 120
tail -1 logfile | grep -q "[INFO] Stream Closed"
if [[ $? -eq 1 ]]
then
java -jar xyz.jar &
fi
done
答案 1 :(得分:1)
可能存在这样的情况:尾部上次日志“Stream Closed”不是真正的最后一个日志,并且该进程仍在记录消息。我们可以通过检查进程是否存活来避免这种情况。如果进程退出并且最后一个日志是“Stream Closed”,那么我们需要重新启动应用程序。
#!/bin/bash
java -jar xyz.jar &
PID=$1
while [ true ]
do
tail -1 logfile | grep -q "Stream Closed" && kill -0 $PID && sleep 20 && continue
java -jar xyz.jar &
PID=$1
done
答案 2 :(得分:0)
答案 3 :(得分:0)
我使用监视程序脚本解决了这个问题,该程序直接检查(grep)程序是否正在运行。通过每分钟调用看门狗(来自ubuntu下的cron),我基本上保证(程序和环境非常稳定),任何程序都不会保持脱机状态超过59秒。
此脚本将使用数组中的名称检查程序列表,并查看每个程序是否正在运行,如果没有,则启动它。
#!/bin/bash
#
# watchdog
#
# Run as a cron job to keep an eye on what_to_monitor which should always
# be running. Restart what_to_monitor and send notification as needed.
#
# This needs to be run as root or a user that can start system services.
#
# Revisions: 0.1 (20100506), 0.2 (20100507)
# first prog to check
NAME[0]=soc_gt2
# 2nd
NAME[1]=soc_gt0
# 3rd, etc etc
NAME[2]=soc_gp00
# START=/usr/sbin/$NAME
NOTIFY=you@gmail.com
NOTIFYCC=you2@mail.com
GREP=/bin/grep
PS=/bin/ps
NOP=/bin/true
DATE=/bin/date
MAIL=/bin/mail
RM=/bin/rm
for nameTemp in "${NAME[@]}"; do
$PS -ef|$GREP -v grep|$GREP $nameTemp >/dev/null 2>&1
case "$?" in
0)
# It is running in this case so we do nothing.
echo "$nameTemp is RUNNING OK. Relax."
$NOP
;;
1)
echo "$nameTemp is NOT RUNNING. Starting $nameTemp and sending notices."
START=/usr/sbin/$nameTemp
$START 2>&1 >/dev/null &
NOTICE=/tmp/watchdog.txt
echo "$NAME was not running and was started on `$DATE`" > $NOTICE
# $MAIL -n -s "watchdog notice" -c $NOTIFYCC $NOTIFY < $NOTICE
$RM -f $NOTICE
;;
esac
done
exit
我不使用日志验证,但您可以轻松地将其合并到您自己的版本中(例如,只需更改grep以进行日志检查)。
如果你从命令行(或putty,如果你是远程连接)运行它,你会看到什么工作,什么不是。几个月来一直使用它没有打嗝。只要你想知道什么在起作用(无论它在cron下运行),都可以调用它。
您还可以将所有关键程序放在一个文件夹中,执行目录列表并检查该文件夹中的每个文件是否都有以相同名称运行的程序。或者逐行读取一个txt文件,每一行都对应一个应该运行的程序。 etcetcetc
答案 4 :(得分:0)
一个好方法是使用awk命令:
tail -f somelog.log | awk '/.*[INFO] Stream Closed.*/ { system("java -jar xyz.jar") }'
这会持续监视日志流,并且当正则表达式与您设置的任何系统命令相匹配时,这将是您在shell中键入的任何内容。
如果你真的想要做得好,可以将该行放入.sh文件中,并从进程监控守护进程(如upstart)运行该.sh文件,以确保它永远不会死亡。
美好而干净= D