프로세스 상태가 변경될 때만 이메일 알림을 보내는 스크립트

프로세스 상태가 변경될 때만 이메일 알림을 보내는 스크립트

다음 스크립트는 MStrsvr 프로세스가 실행 중인지 확인합니다. 내가 직면하고 있는 문제는 이 스크립트를 1시간마다 실행하도록 크론 탭을 예약하면 1시간마다 "MSTRSvr이 실행 중입니다"라는 이메일 경고가 전송된다는 것인데, 이는 원하지 않습니다. 서버가 중지/시작될 때만 스크립트가 경고하도록 하고 싶습니다.

#!/bin/ksh
hos=$(hostname)

curr_Dt=$(date +"%Y-%m-%d %H:%M:%S")

var=$(ps -ef | grep -i '[/]MSTRSvr')

if [ -z "$var" ]
then

    echo "ALERT TIME : $curr_Dt" >>wa.txt
    echo "SERVER NAME : $hos" >>wa.txt
    echo "\n \n" >>wa.txt
    echo " MSTRSvr is not running on $hos Please check for possible impact " >>wa.txt
    echo "\n \n" >>wa.txt

    mail -s "MSTRSvr process ALERT" [email protected] <wa.txt

else

    echo "MSTRSvr is running" >>mi.txt

    mail -s "MSTRSvr process ALERT" [email protected] <mi.txt

fi

rm wa.txt 2>ni.txt
rm mi.txt 2>ni.txt

답변1

#-----------------------------------------------------------------------
#!/bin/ksh

hos=$(hostname)
curr_Dt=$(date +"%Y-%m-%d %H:%M:%S")

# I am going to get the process ID for the MSTRSvr.
ProcessPID=$(ps -ef | grep -i '[/]MSTRSvr' | grep -v grep | awk '{print $2}') 

if [[ -z ${ProcessPID} ]]; then
    # There is no PID, Not running!
    echo "ALERT TIME : $curr_Dt" >>wa.txt
    echo "SERVER NAME : $hos" >>wa.txt
    echo "\n \n" >>wa.txt
    echo " MSTRSvr is not running on $hos Please check for possible impact " >>wa.txt
    echo "\n \n" >>wa.txt
    mail -s "MSTRSvr process ALERT" [email protected] <wa.txt
else
    # The process is running check it against the last recorded PID.
    # You can also compare /tmp/MSTRSvr.pid with ${ProcessPID}.
    kill -0 `cat /tmp/MSTRSvr.pid` > /dev/null 2>&1
    if [[ $? -ne 0 ]]; then
       # The current PID does not match.
       echo "MSTRSvr was restarted." >>mi.txt
       # Update the tempfile with current running PID.
       echo ${ProcessPID}>/tmp/MSTRSvr.pid
       mail -s "MSTRSvr process ALERT" [email protected] <mi.txt
    fi
fi

rm wa.txt 2>ni.txt
rm mi.txt 2>ni.txt
#---------------------------------------------------------------------

이 스크립트를 처음 실행하기 전에 /tmp/MSTRSvr.pid 파일을 생성하고 파일에 "999999999"(임의의 숫자)를 추가하면 "else" 명령 아래의 확인이 실패하고 ' MSTRSvr이 다시 시작되었습니다.' '무시하고 계속하세요...

따라서 각 간격 스크립트는 PID를 확인한 다음 마지막으로 알려진 PID를 확인합니다.

답변2

서버의 마지막 상태에 대한 테스트를 추가합니다.

#!/bin/ksh
hos=$(hostname)

curr_Dt=$(date +"%Y-%m-%d %H:%M:%S")

var=$(ps -ef | grep -i '[/]MSTRSvr')

if [ -z "$var" ]
then
    echo "ALERT TIME : $curr_Dt" >>wa.txt
    echo "SERVER NAME : $hos" >>wa.txt
    echo "\n \n" >>wa.txt
    echo " MSTRSvr is not running on $hos Please check for possible impact " >>wa.txt
    echo "\n \n" >>wa.txt

    echo "stopped" > "filewithlaststate.txt"

    mail -s "MSTRSvr process ALERT" [email protected] <wa.txt

else

    if [ "$(cat "filewithlaststate.txt")" != "running" ]
    then 
         echo "MSTRSvr is running" >>mi.txt

         echo "running" > "filewithlaststate.txt"

         mail -s "MSTRSvr process ALERT" [email protected] <mi.txt
    fi

fi

rm wa.txt 2>ni.txt
rm mi.txt 2>ni.txt

관련 정보