Nagios 서비스 상태를 지속적으로 모니터링하기 위해 쉘 스크립트를 작성했습니다(참조:이것질문은 다음과 같습니다.
#!/bin/bash
RCPT="[email protected]"
service nagios status | grep [0-9]
if [ $? -eq 0 ]
then
exit 0
else
service nagios start
echo "Hello, Nagios Service has been started, please confirm." | mail -s "Nagios Service Stopped" $RCPT
fi
명령줄에서 위 스크립트를 실행하면 예상대로 작동합니다. 서비스 상태 출력에서 PID를 찾을 수 없으면 이메일을 보내고 그렇지 않으면 종료됩니다. 하지만 이 스크립트를 에 추가하면 crontab
실행될 때마다 알림이 표시됩니다.
무엇이 문제이고 어떻게 극복할 수 있나요?
답변1
기본적으로 cron
매우 제한된 명령 세트가 실행되며 PATH
여기에는 귀하의 명령이 포함되지 않습니다 service
. 이로 인해 이메일이 전송되도록 하는 0이 아닌 반환 코드가 생성될 수 있습니다.
파일에 달리 지정하지 않는 한 crontab
명령은 다음 경로에서 실행됩니다.
PATH=/usr/bin:/bin
대조적으로, service
일반적으로 usr/sbin
기본값은 다음과 같습니다 PATH
.
# type service
service is /usr/sbin/service
두 가지 일반적인 솔루션이 있습니다.
PATH
스크립트 상단 근처에 필요한 내용이 포함된 설명을 제공하세요crontab
.모든 경로를 명시적으로 지정합니다.
전자가 더 편리합니다. 후자가 더 안전한 것으로 간주됩니다.
crontab 명령을 디버깅하는 방법
이메일 시스템이 잘 설정된 시스템에서는 cron
cron 작업에 오류가 발생할 때마다 스크립트 출력이 포함된 이메일이 사용자에게 전송됩니다. 그러나 모든 시스템에 이메일이 잘 설정된 것은 아닙니다. cron
오류 알림도 로거로 전송되지만 로거의 오류 처리는 로거의 구성에 따라 달라지며 이는 불투명할 수 있습니다.
이러한 경우 cron 명령이 실행되는 동안 모든 오류 메시지를 직접 수집하되 crontab 줄을 변경하십시오. 다음과 같은 것을 사용하십시오:
1 2 * * * /path/to/myscript >>/tmp/myscript.log 2>&1
그러면 stdout 및 stderr이 로그 파일로 리디렉션됩니다 /tmp/myscript.log
. 명령이 실행된 후 이 로그 파일을 확인하십시오.
답변2
출력을 다음으로 리디렉션할 수 있습니다 /dev/null
(저는 Thunderbird 앱에서 이 작업을 수행합니다).
30 05 * * * /usr/bin/thunderbird >/dev/null 2>&1
>>
또는 추가 작업을 사용하여 파일로 리디렉션합니다.
30 05 * * * /usr/bin/thunderbird >>/tmp/mycron.log 2>&1
노트:/etc/init.d/NetworkManager status
대신 서비스 파일의 전체 경로(예: )를 사용할 수 있습니다 service NetworkManager status
.
추천하다:
및 명령의 조합을 사용하여 pidof
소프트웨어를 관찰하는 것이 가장 좋습니다 ps -p
. 서비스 파일이 /var/run/
디렉토리의 pid 파일을 확인하고 프로그램이 실수로 종료된 경우(예: Signal 9) 해당 pid 파일이 존재하기 때문입니다! 그러나 스마트 서비스 파일은 status
기능적으로 이러한 상황을 확인합니다.
예를 들어:
while :; do
pid=$(pidof SOFTWARE)
watch=$(ps -p ${pid} >/dev/null 2>&1 && echo $?)
[[ ${watch} -ne 0 ]] && service SOFTWARE restart
sleep 3
done