Ниже приведен мой сценарий, который я выполняю в bash. И он работает нормально.
fileexist=0
for i in $( ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done); do
mv /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done /data/read-only/clv/daily/archieve-wip/
fileexist=1
done
Заявление проблемы:-
В моем вышеприведенном shell-скрипте, который должен выполняться ежедневно с помощью cron job
, у меня нет никакого механизма обработки ошибок/исключений
. Предположим, если что-то пойдет не так, я не буду знать, что произошло?
Так как после выполнения вышеуказанного скрипта, есть некоторые другие скрипты, которые будут зависеть от данных, предоставленных вышеуказанным скриптом
, поэтому я всегда получаю жалобы от других людей, которые зависят от данных моего скрипта, что произошло что-то не так.
Так есть ли способ, которым я могу получить уведомление, если что-то не так произошло
в моем скрипте? Предположим, если кластер проводит некоторое обслуживание
и в это время я запускаю свой скрипт, так что определенно он будет терпеть неудачу, так что могу ли я быть уведомлен, если мои вышеупомянутые скрипты не удались, так что я буду уверен, что произошло что-то неправильное.
Надеюсь, мой вопрос достаточно ясен.
Любые мысли будут оценены по достоинству.
Вы можете проверить статус выхода каждой команды, как ответил freetx, но это ручная проверка ошибок, а не обработка исключений. Стандартный способ получить эквивалент обработки исключений в sh
- это запустить скрипт с set -e
. Это указывает sh
завершить работу с ненулевым статусом, как только любая выполненная команда потерпит неудачу (т.е. завершится с ненулевым статусом выхода).
Если предполагается, что какая-то команда в таком сценарии (возможно) не выполнится, вы можете использовать конструкцию COMMAND || true
, которая заставит нулевой статус выхода для этого выражения. Например:
#!/bin/sh
# if any of the following fails, the script fails
set -e
mkdir -p destdir/1/2
mv foo destdir/1/2
touch /done || true # allowed to fail
Другой способ гарантировать, что вы будете уведомлены, когда что-то пойдет не так в сценарии, вызываемом cron, - это придерживаться соглашения Unix ничего не печатать, если не произошла ошибка. В этом случае успешные запуски пройдут без уведомления, а неудачные вызовы заставят демона cron уведомить вас об ошибке по электронной почте. Обратите внимание, что локальная доставка почты должна быть правильно настроена в вашей системе, чтобы это работало.
Обычно все утилиты командной строки unix возвращают 0 при успехе и ненулевое значение при неудаче. Поэтому вы можете использовать шаблон $? для отображения последнего возвращаемого значения и действовать соответствующим образом.
Например:
> ls
> file1 file2
> echo $?
> 0
> ls file.no.exist
> echo $?
> 1
Поэтому вы можете использовать это как элементарное обнаружение ошибок, чтобы увидеть, если что-то идет не так. Таким образом, нормальный подход был бы следующим
some_command
if [ $? -gt 0 ]
then
handle_error here
fi
если другие скрипты находятся на той же машине, то вы могли бы сделать pgrep в других скриптах для этого скрипта, если он найден, чтобы заснуть на некоторое время и попробовать другие скрипты позже, перепроверив, что процесс исчез.
Если скрипт находится на другой машине или даже локально, другой метод заключается в создании временного файла на удаленной машине, доступного через запущенный http браузер, который другие скрипты могут проверить статус, т.е. запущен или завершен.
Вы также можете обернуть скрипт вокруг другого, который ищет эти ошибки и посылает вам письмо, если находит, если нет - отправляет результат, как обычно, тому, кто его нашел.
go=0;
function check_running() {
running=`pgrep -f your_script.sh|wc -l `
if [ $running -gt 1 ]; then
echo "already running $0 -- instances found $running ";
go=1;
}
check_running;
if [ $go -ge 1 ];then
execute your other script
else
sleep 120;
check_running;
fi