Предупреждать в crontab, если команда не удалась несколько раз подряд

Во-первых, установка статического IP-адреса для ваших основных устройств - это разумная идея и обязательное условие, если вы используете серверы, которым требуется проброс портов. Во-вторых, вы должны быть в состоянии просто заполнить IP-адрес именем хоста в большинстве ОС Linux/Unix из коробки (без использования /etc/hosts). Попробуйте просто использовать ssh mylinuxbox, когда mylinuxbox - это имя хоста удаленного компьютера.

3
09.11.2016, 13:15
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

Сам скрипт (опирается на md5sumиз GNU 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"
1
27.01.2020, 21:30

Теги

Похожие вопросы