kzen.dev
  • Вопросы
  • Метки
  • Пользователи
Оповещения
Вознаграждения
Регистрация
После регистрации, сможете получать уведомления об ответах и комментариях на Ваши вопросы.
Вход
Если у Вас уже есть аккаунт, войдите чтобы проверить новые уведомления.
Тут будут вознаграждения за добавленные вопросы, ответы и комментарий.
Дополнительно
Источник
Редактировать
 arsenal
arsenal
Вопрос

Как обработать ошибку/исключение в сценарии оболочки?

Ниже приведен мой сценарий, который я выполняю в 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, у меня нет никакого механизма обработки ошибок/исключений. Предположим, если что-то пойдет не так, я не буду знать, что произошло?

Так как после выполнения вышеуказанного скрипта, есть некоторые другие скрипты, которые будут зависеть от данных, предоставленных вышеуказанным скриптом, поэтому я всегда получаю жалобы от других людей, которые зависят от данных моего скрипта, что произошло что-то не так.

Так есть ли способ, которым я могу получить уведомление, если что-то не так произошло в моем скрипте? Предположим, если кластер проводит некоторое обслуживание и в это время я запускаю свой скрипт, так что определенно он будет терпеть неудачу, так что могу ли я быть уведомлен, если мои вышеупомянутые скрипты не удались, так что я буду уверен, что произошло что-то неправильное.

Надеюсь, мой вопрос достаточно ясен.

Любые мысли будут оценены по достоинству.

6 2012-09-08T23:38:25+00:00 3
 arsenal
arsenal
Редактировал вопрос 10-го сентября 2012 в 2:52
Программирование
linux
shell
unix
bash
Решение / Ответ
 user4815162342
user4815162342
9-го сентября 2012 в 6:30
2012-09-09T06:30:28+00:00
Дополнительно
Источник
Редактировать
#17159923

Вы можете проверить статус выхода каждой команды, как ответил 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 уведомить вас об ошибке по электронной почте. Обратите внимание, что локальная доставка почты должна быть правильно настроена в вашей системе, чтобы это работало.

 user4815162342
user4815162342
Редактировал ответ 19-го сентября 2012 в 12:13
11
0
 freetx
freetx
9-го сентября 2012 в 12:27
2012-09-09T00:27:39+00:00
Дополнительно
Источник
Редактировать
#17159921

Обычно все утилиты командной строки unix возвращают 0 при успехе и ненулевое значение при неудаче. Поэтому вы можете использовать шаблон $? для отображения последнего возвращаемого значения и действовать соответствующим образом.

Например:

> ls
> file1 file2
> echo $?
> 0
> ls file.no.exist
> echo $?
> 1

Поэтому вы можете использовать это как элементарное обнаружение ошибок, чтобы увидеть, если что-то идет не так. Таким образом, нормальный подход был бы следующим

some_command
if [ $? -gt 0 ]
then
handle_error here
fi
5
0
Vindicated Halcyon
Vindicated Halcyon
9-го сентября 2012 в 12:30
2012-09-09T00:30:54+00:00
Дополнительно
Источник
Редактировать
#17159922

если другие скрипты находятся на той же машине, то вы могли бы сделать 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
0
0
Похожие сообщества 22
DevOps — русскоговорящее сообщество
DevOps — русскоговорящее сообщество
14 834 пользователей
Общаемся на темы DevOps, мониторинга, метрикам и облакам. Новости. См. также: @kubernetes_ru, @docker_ru, @ceph_ru, @openstack_ru FAQ и правила: https://git.io/JtnWb Вакансии и поиск работы: @devops_jobs
Открыть telegram
DevOps Jobs - работа и аналитика
DevOps Jobs - работа и аналитика
12 585 пользователей
Публикуем вакансии и запросы на поиск работы по направлению DevOps & SRE. Обмен инсайдами и аналитикой на рынке труда DevOps & SRE. Вакансии в @devops_jobs_feed FAQ и правила: https://git.io/JtnWb Старт бота "/man" См.также: @devops_ru, @kubernetes_ru
Открыть telegram
GNU/Linux Help
GNU/Linux Help
4 510 пользователей
Правила: https://t.me/grouplinux/1660070 #FAQ: https://t.me/grouplinux/1660058 Linux Flood: https://t.me/+mKsgPMYA_BIzODZi Linux: VFIO PCI Passthrough: @vfiolinux
Открыть telegram
Альт Линукс
Альт Линукс
4 123 пользователей
Открыть telegram
Системное администрирование
Системное администрирование
3 682 пользователей
Чат посвящён любым вопросам системного администрирования. Правила - https://t.me/srv_admins/1472142 Группа по Керио - https://t.me/Kerio_control Вопросы, обратная связь, реклама @SA_FRY_BOT
Открыть telegram
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
🐧 RU.UBUNTU — Официальное сообщество пользователей Ubuntu Linux
3 242 пользователей
Сообщество пользователей Ubuntu ⚠️ Правила: https://t.me/ru_ubuntu/494413 Список групп и каналов: https://github.com/goq/telegram-list
Открыть telegram
Добавить вопрос
Категории
Все
Технологий
Культура / Отдых
Жизнь / Искусство
Наука
Профессии
Бизнес
Пользователи
Все
Новые
Популярные
1
Ilya Smirnov
Зарегистрирован 5 дней назад
2
Денис Васьков
Зарегистрирован 1 неделю назад
3
Dima Patrushev
Зарегистрирован 1 неделю назад
4
sirojidddin otaboyev
Зарегистрирован 2 недели назад
5
Елена Гайдамамакинат
Зарегистрирован 2 недели назад
RU
© kzen.dev 2023
Источник
stackoverflow.com
под лицензией cc by-sa 3.0 с атрибуцией