나는 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
확인. VAL1과 VAL2를 얻으려는 테스트에서'ps | grep'을/dev/null로 설정하십시오. 의미 VAL1과 VAL2는 항상 비어 있습니다. 또한 테스트를하지 않은 잘못된 'elseif'가있는 것 같습니다. 'else'다음에 오는 것이고, VAL1 및 VAL2가없는 경우 Foo를 다시 시작하기를 원하기 때문에 아마 거기에 있으면 안됩니다. –
아마도 Foo는 SIGCHLD가 자식 중 하나가 죽는 것을 알기 위해 모니터해야합니다 ... – twalberg