У меня есть сценарий. ls, cp, mv Я хочу, чтобы в случае сбоя какой-либо команды это должно было быть предупреждено по электронной почте, а также после успешного соревнования. Любая идея? Я могу настроить оповещение по электронной почте, но хочу знать, как проверить наличие ошибок и успешную попытку.
Bash не имеет встроенных предупреждений об этом, вам нужно записать их в свой скрипт, установив флажок $?
переменная (содержит код выхода последней команды запуска) и выполняет над ней действие.
Совершенно простая проверка того, что электронные письма будут выглядеть так:
if [ $? -ne 0 ]
then
<send me email however you want to about failure>
else
<send me email about success how ever you want>
fi
Обязательно проверьте документацию по командам, чтобы убедиться, что для успешного выполнения установлен код выхода 0.
Вы можете продолжить выполнение ряда команд до "отказа", используя "&&" для последовательного выполнения команд; каждая команда возвращает значение «истина», вызывая выполнение следующей команды. Затем используйте "||" для выполнения команды в случае сбоя, например:
#!/bin/bash
cp foo bar \
&& mv bar bar{,.bak} \
&& echo "good so far" \
&& ls file123 | tee -a /tmp/msg.txt \
&& mailx -u user -s "success" -f /tmp/msg.txt \
|| mailx -u user -s "failure" -f ~/err.txt
Поскольку это может привести к путанице, используйте такие функции, как
#!/bin/bash
do_work() {
mv... || return 1
cp... || return 1
return 0
}
report() {
[ "$1" = "ok" ] && mailx ....
[ "$1" != "ok" ] && mailx -s "$1" ....
return 0
}
do_work \
&& report ok
|| report err
Кроме того, продолжая приведенный выше пример, вы можете добавить общие правила через «ловушку» в скрипте, которая всегда будет выполнять определенные команды, если любой тип статуса ошибки возвращается в любой момент скрипта (включая получение control-c (прерывание ) сигнал во время работы скрипта):
#!/bin/bash
tmp=/tmp/msg.$$.txt
# Cleanup: delete tmp files on exit. On any error, trap and exit... then cleanup
trap 'echo "cleaning up tmpfiles..." && rm $tmp >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
...
do_work && exit 0
(Заявление об ограничении ответственности ... приведенные выше команды являются общим псевдокодом и просто набираются из памяти без их запуска. Несомненно, существуют опечатки.)
Вы используете оболочку команды mailwrap, которая принимает некоторые параметры, определяющие, кому отправлять почту, перед запуском команды, которая является ее параметром. Команда mailwrap отправляет электронное письмо только при наличии вывода или в случае сбоя сценария. Есть много вариантов, и это хорошие упражнения, чтобы написать себя, если вам не нравятся те, которые вы находите.
На #!
строка самого скрипта, вы используете -e
, так что любой отказавший конвейер команд вызывает прерывание сценария в этой точке. Вы также можете использовать -u
, чтобы прервать использование неустановленной переменной.
Чтобы иметь неудачную команду не прервите скрипт, вы добавите || true
, читается как "или истина", поэтому ошибка не имеет значения. (Более идиоматично, || :
что одно и то же).
Если вы хотите точно узнать, где не удалось выполнить команду, выполняющую обычное молчание, используйте команду mailwrap, которая не отправляет электронную почту. просто из-за вывода на stderr, а затем вы используете -v
на оболочке #!
линия, чтобы отслеживать команды, когда они будут запущены.
Или отправьте вывод скрипта по электронной почте, независимо от результата, пока вы не будете довольны его работой.
Что-то вроде:
(cat $resultofscript) | mailx -s "Subject" me@me.com