ログファイルに文字列がある場合(関連する文字列が見つかった場合)を生成し、警告を出し、スレッドダンプを取得するスクリプトを作成する必要があります/tmp/area.log
。これまでは、2つの別々のスクリプトを使用してこれを実行できますが、これを1つにマージしたいと思います。
スクリプト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 ]];
実際のブロックにラップする必要があります。
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部分を最適化する必要があります。