명령이 연속해서 여러 번 실패하면 crontab에서 경고합니다.

명령이 연속해서 여러 번 실패하면 crontab에서 경고합니다.

내 crontab에는 서비스를 모니터링하는 명령이 있습니다(구체적으로 내 웹 사이트의 Tor 버전에 여전히 액세스할 수 있는지 확인). 사이트에 액세스할 수 있으면 모니터링 명령이 성공하고, 그렇지 않으면 실패합니다(이메일 메일을 받습니다). 그러나 간헐적인 Tor 중단으로 인해 가끔 이메일을 받게 되며 가동 중지 시간은 상당히 짧습니다.

내 crontab의 이 모니터링 명령이 연속해서 여러 번(예: 10회) 실패하면 알림을 받고 싶으므로 중단 시간이 길어질 때만 알림을 받게 됩니다.

물론 이를 수행하기 위해 사용자 정의 스크립트를 작성하고 임시 파일에 실패 횟수를 저장하는 등의 작업을 수행할 수 있지만 이는 매우 일반적인 요구 사항인 것처럼 보이므로 이미 표준 솔루션(동일한 파일에)이 있을 수 있다고 생각했습니다. (中) 그렇군요.더 많은 유틸리티' chronic유사하지만 다른 목적을 제공하기 위해 이미 존재합니다. )

마지막 10번의 호출이 실패하지 않는 한 문제가 wrapper COMMAND실행 되고 성공하도록 하는 래퍼 스크립트가 있습니까 ? 이 경우 마지막 오류 코드와 실패한 호출의 출력을 반환해야 합니까?COMMANDCOMMAND

답변1

다음 스크립트는 설명하는 내용에 대한 래퍼로 사용할 수 있습니다. 주어진 명령의 표준 출력 및 표준 오류 스트림을 상태 디렉터리( $HOME/states)에 저장하고 실패한 실행 수를 저장합니다.

명령이 10회 이상(또는 명령줄 플래그에 지정된 숫자만큼 -t) 실행에 실패하면 표준 오류 스트림에 일부 출력이 제공됩니다. 다른 모든 경우에는 출력이 제공되지 않습니다. 스크립트는 주어진 명령과 동일한 종료 상태로 종료됩니다.

사용 예:

$ sh ./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
$ sh ./script.sh -t 2 sh -c 'echo "this will fail"; cd /nowhere'
FAILED 2 times: sh -c echo "this will fail"; cd /nowhere
f88eff95bba49f6dd35a2e5ba744718d
stdout --------------------
this will fail
stderr --------------------
sh: cd: /nowhere - No such file or directory
END

스크립트 자체( md5sumGNU coreutils에 따라 다름):

#!/bin/sh

statedir="$HOME/states"

if ! mkdir -p "$statedir"; then
        printf 'Failed creating "%s"\n' "$statedir" >&2
        exit 1
fi

max_tries=10

while getopts 't:' opt; do
        case "$opt" in
                t) max_tries=$OPTARG ;;
                *) echo 'error' >&2
                   exit 1
        esac
done

shift "$(( OPTIND - 1 ))"

hash=$( printf '%s\n' "$@" | md5sum | cut -d ' ' -f 1 )

"$@" >"$statedir/$hash".out 2>"$statedir/$hash".err
code=$?

if [ -f "$statedir/$hash" ]; then
        read tries <"$statedir/$hash"
else
        tries=0
fi

if [ "$code" -eq 0 ]; then
        echo 0 >"$statedir/$hash"
        exit 0
fi

tries=$(( tries + 1 ))
printf '%d\n' "$tries" >"$statedir/$hash"

if [ "$tries" -ge "$max_tries" ]; then
        cat >&2 <<END_MESSAGE
FAILED $tries times: $@
stdout --------------------
$(cat "$statedir/$hash".out)
stderr --------------------
$(cat "$statedir/$hash".err)
END
END_MESSAGE
fi

exit "$code"

관련 정보