ログ内の文字列を見つけて通知を設定し、スレッドダンプを生成します。

ログ内の文字列を見つけて通知を設定し、スレッドダンプを生成します。

ログファイルに文字列がある場合(関連する文字列が見つかった場合)を生成し、警告を出し、スレッドダンプを取得するスクリプトを作成する必要があります/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部分を最適化する必要があります。

おすすめ記事