如果日志文件中存在字符串(找到相关字符串),我需要编写一个脚本来创建、发出警报并获取线程转储 - /tmp/area.log
。到目前为止,我可以用两个单独的脚本来完成此操作,但希望将它们合并为一个。
脚本 1:创建警报
filelocation=$1
string=$2
count=$(cat $1 | grep -i "$2" | wc -l)
if [[ "$count" -ge 1 ]];
then
echo "WARNING: There are $count occurrences of $2 in log file"
exit 1
else
echo "OK: No lines with $2 in log file"
exit 0
fi
脚本 2:创建线程转储
#!/bin/bash
PID=$(ps -ef | grep java | awk '{print $2}')
N=3
INTERVAL=5
for ((i=1;i<=$N;i++))
do
# d=$(date +%Y%m%d-%H:%M:%S)
# dump="/tmp/Threaddump-$PID-$d.txt"
dump="/tmp/ThreadDump-`hostname`-`date '+%F-%H:%M:%S'`.gz"
echo $i of $N: $dump
/opt/jdk1.8.0_121/jdk1.7.0_40/bin/jstack -l $PID > $dump
sleep $INTERVAL
done
答案1
很简单,希望您在日志中找到该字符串时要求进行线程转储。
因此,当脚本 1 在日志中找到字符串时,您需要运行线程转储脚本。为此,您需要将线程转储脚本包含在 if [[ "$count" -ge 1 ]];
true 块中。
filelocation=$1
string=$2
count=$(cat $1 | grep -i "$2" | wc -l)
if [[ "$count" -ge 1 ]];
then
echo "WARNING: There are $count occurrences of $2 in log file"
PID=$(ps -ef | grep java | awk '{print $2}')
N=3
INTERVAL=5
for ((i=1;i<=$N;i++))
do
# d=$(date +%Y%m%d-%H:%M:%S)
# dump="/tmp/Threaddump-$PID-$d.txt"
dump="/tmp/ThreadDump-`hostname`-`date '+%F-%H:%M:%S'`.gz"
echo $i of $N: $dump
/opt/jdk1.8.0_121/jdk1.7.0_40/bin/jstack -l $PID > $dump
sleep $INTERVAL
done
exit 1
else
echo "OK: No lines with $2 in log file"
exit 0
fi
如果您希望脚本不断查找日志并执行线程转储,则需要有一个具有 5-10 秒睡眠的包装循环语句,并连续执行此解析和转储逻辑。
用于持续监控日志的代码更改。
在文件位置语句之后有一个无限循环,包括 60 秒的睡眠(这取决于您需要多少睡眠时间)并在最后一行结束循环。你需要做异常处理,你可以妖魔化这个脚本。
正如 @wildcard 所提到的,您需要优化解析和 PID 部分。