2014-06-18 2 views
2

나는 ps를 신뢰할 수 없다고 알고 있습니다. grep 또는 variants를 사용하여 PID가 시작되었는지 정확하게 알 수 있습니다. 그러나 나는이 문제가 다음 릴리스에서 해결 될 때까지 잠시 동안 필요한 것을 알고 있습니다.실패한 경우 프로세스 및 센드 메일을 모니터링하는 Bash 스크립트

부모 인 Foo라는 프로세스가 있고 TEST1과 TEST2는 하위 프로세스입니다. TEST1 및/또는 TEST2가 꺼지면 Foo는 계속 실행되고 올바르게 작동하는 데 필요한 TEST1 및/또는 TEST2를 다시 생성하지 않습니다. TEST1 및/또는 TEST2를 다시 시작하는 프로그램이 먼저 Foo를 다시 시작해야하기 때문에 어떻게 알 수 있습니까?

자식 프로세스를 모니터링하려는 경우 실패한 sendemail에 실패하면 서비스를 다시 시작하고 다시 시작한다는 다른 전자 메일을 보냅니다. 5 분마다 CRON을 통해 스크립트를 실행할 계획입니다.

수표는 독립적으로 작동하며 센드 메일도 작동합니다. 문제는 if else 문을 만들 때입니다. TEST1 또는 TEST2가 죽으면 여전히 실행 중이 아닌 것으로 기록됩니다. 누군가 제발 나를 도와 줄 수 있어요.

#!/bin/bash 
#Check if process is running 
VAL1=`/usr/ucb/ps aux | grep "[P]ROCESS TEST1" >/dev/null` 
VAL2=`/usr/ucb/ps aux | grep "[P]ROCESS TEST2" >/dev/null` 
if $VAL1 && $VAL2; then 
echo "$(date) - $VAL1 & $VAL2 is Running" >> /var/tmp/Log.txt; 
else 
SUBJ="Process has stopped" 
FROM="Server" 
TO="[email protected]" 
(
cat << ! 
To : ${TO} 
From : ${FROM} 
Subject : ${SUBJ} 
! 
cat << ! 
The $VAL1 and $VAL2 went down at $(date) please login to the server to restart 
! 
) | sendmail -v ${TO} 
elseif 
/usr/sbin/svcadm disable Foo; 
wait 10; 
/usr/sbin/svcadm enable Foo; 
fi 
+0

확인. VAL1과 VAL2를 얻으려는 테스트에서'ps | grep'을/dev/null로 설정하십시오. 의미 VAL1과 VAL2는 항상 비어 있습니다. 또한 테스트를하지 않은 잘못된 'elseif'가있는 것 같습니다. 'else'다음에 오는 것이고, VAL1 및 VAL2가없는 경우 Foo를 다시 시작하기를 원하기 때문에 아마 거기에 있으면 안됩니다. –

+0

아마도 Foo는 SIGCHLD가 자식 중 하나가 죽는 것을 알기 위해 모니터해야합니다 ... – twalberg

답변

2

테스트의 한 가지 점은 출력을 /dev/null으로 푸시한다는 것입니다. 즉, VAL1과 VAL2는 항상 비어 있습니다.

두 번째로, elif는 필요하지 않습니다. 기본 조건은 두 가지입니다. 어떤 일들이 실행되고 있거나 그렇지 않습니다. 실행 중이 아닌 것이 있으면 이메일을 보내십시오. PROCESS TEST1 또는 PROCESS TEST2가 사망했는지 여부를 확인하기 위해 몇 가지 추가 테스트를 수행 할 수 있지만 엄격하게 필요하지는 않습니다.

동일한 작업을 수행하는 스크립트를 작성하는 방법은 다음과 같습니다.

#!/usr/bin/env bash 

#Check if process is running 
PID1=$(/usr/ucb/ps aux | grep "[P]ROCESS TEST1" | awk '{print $2}') 
PID2=$(/usr/ucb/ps aux | grep "[P]ROCESS TEST2" | awk '{print $2}') 

err=0 

if [ "x$PID1" == "x" ]; then 
     # PROCESS TEST1 died 
     err=$((err + 1)) 
else 
     echo "$(date) - PROCESS TEST1 $VAL2 is Running" >> /var/tmp/Log.txt; 
fi 

if [ "x$PID2" == "x" ]; then 
     # PROCESS TEST2 died 
     err=$((err + 2)) 
else 
     echo "$(date) - PROCESS TEST2 is Running" >> /var/tmp/Log.txt; 
fi 

if (($err > 0)); then 
     # identify which PROCESS TEST had the problem. 
     if $((err == 1)); then 
       condition="PROCESS TEST1 is down" 
     elif (($err == 2)); then 
       condition="PROCESS TEST2 is down" 
     else 
       condition="PROCESS TEST1 and PROCESS TEST2 are down" 
     fi 

     # let's send an email to get eyes on the issue, but we will restart the process after 
     # we send the email. 
     SUBJ="Process Error Detected" 
     FROM="Server" 
     TO="[email protected]" 
     (
     cat <<-EOT 
     To : ${TO} 
     From : ${FROM} 
     Subject : ${SUBJ} 

     $condition at $(date) please login to the server to check that the processes were restarted successfully. 

     EOT 
     ) | sendmail -v ${TO} 

     # we reached an error condition, and we sent mail 
     # now let's restart the svc. 
     /usr/sbin/svcadm restart Foo 
fi 
+0

업데이트 된 코드를 보내 주셔서 감사합니다. 나는 자주 코드를 작성하지 않고 내일 수정하고 테스트 할 것입니다. 코드를 들여 쓰면 코드를 들여 쓰게됩니다. – JeremyA1

+0

걱정할 필요가 없습니다. 단지 돕고 싶었지만 예제가 더 건설적이라고 생각했습니다. –

+0

이것은 스크립트를 실행하려고했을 때의 것입니다. 줄 47 : 구문 오류 : 예기치 않은 파일 끝 – JeremyA1

0

elseif? 당신은 엘프를 의미합니까?

또한 함수를 사용하고 if 문의 내에서 호출되는 함수 내에 sendmail 부분을 두는 것에 대해 생각해 보셨습니까?

+0

else if elif가 아니라 순서입니다. 'if, else, elif, fi'가 아니라'if, elif, else, fi'가됩니다. 엘프에게는 시험이 필요해. 너는 시험이 없다. 소리내어 울기위한 들여 쓰기 코드. –