로그 파일에 문자열이 있는 경우(관련 문자열이 발견된 경우) 생성하고, 경고를 발생시키고, 스레드 덤프를 가져오는 스크립트를 작성해야 합니다 /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 부분을 최적화해야 합니다.