cron에 추가할 때 쉘 스크립트 문제

cron에 추가할 때 쉘 스크립트 문제

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

두 가지 일반적인 솔루션이 있습니다.

  1. PATH스크립트 상단 근처에 필요한 내용이 포함된 설명을 제공하세요 crontab.

  2. 모든 경로를 명시적으로 지정합니다.

전자가 더 편리합니다. 후자가 더 안전한 것으로 간주됩니다.

crontab 명령을 디버깅하는 방법

이메일 시스템이 잘 설정된 시스템에서는 croncron 작업에 오류가 발생할 때마다 스크립트 출력이 포함된 이메일이 사용자에게 전송됩니다. 그러나 모든 시스템에 이메일이 잘 설정된 것은 아닙니다. 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

관련 정보