로그에서 문자열을 찾아 알림을 설정하고 스레드 덤프를 생성하세요.

로그에서 문자열을 찾아 알림을 설정하고 스레드 덤프를 생성하세요.

로그 파일에 문자열이 있는 경우(관련 문자열이 발견된 경우) 생성하고, 경고를 발생시키고, 스레드 덤프를 가져오는 스크립트를 작성해야 합니다 /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 ]];실제 블록 으로 래핑해야 합니다 .

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 부분을 최적화해야 합니다.

관련 정보