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