bash прервать выполнение скрипта

Команды Exit и коды выхода в Bash

bash прервать выполнение скрипта

В этой статье мы рассмотрим встроенную команду exit в Bash и статусы выхода выполненных команд.

Статус выхода

Каждая команда оболочки возвращает код завершения, когда она завершается, либо успешно, либо безуспешно.

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

Команда date выполнена успешно, и код выхода равен нулю:

Если вы попытаетесь запустить команду ls с несуществующим каталогом, код выхода будет ненулевым:

Код состояния можно использовать для выяснения причины сбоя команды. Страница руководства каждой команды содержит информацию о кодах выхода.

При выполнении многокомпонентного конвейера состояние выхода конвейера соответствует статусу последней команды:

Команда exit в Bash

Команда exit выходит из оболочки со статусом N. Он имеет следующий синтаксис:

Если N не указан, код состояния выхода соответствует коду последней выполненной команды.

При использовании в сценариях оболочки значение, указанное в качестве аргумента команды exit, возвращается в оболочку в качестве кода завершения.

Примеры

Статус выхода команд можно использовать в условных командах, таких как if. В следующем примере grepвыйдет с нуля (что означает true в сценариях оболочки), если «search-string» находится в filename:

При запуске списка команд, разделенных &&(and) или ||(or), состояние выхода команды определяет, будет ли выполнена следующая команда в списке. Здесь команда mkdir будет выполнена только если cd вернет ноль:

Если сценарий заканчивает exit без указания параметра, код завершения сценария – это код последней команды, выполненной в сценарии.

Источник

Как использовать коды завершения в Bash-скриптах

bash прервать выполнение скрипта

Инструменты автоматизации и мониторинга удобны тем, что разработчик может взять готовые скрипты, при необходимости адаптировать и использовать в своём проекте. Можно заметить, что в некоторых скриптах используются коды завершения (exit codes), а в других нет. О коде завершения легко забыть, но это очень полезный инструмент. Особенно важно использовать его в скриптах командной строки.

Что такое коды завершения

В Linux и других Unix-подобных операционных системах программы во время завершения могут передавать значение родительскому процессу. Это значение называется кодом завершения или состоянием завершения. В POSIX по соглашению действует стандарт: программа передаёт 0 при успешном исполнении и 1 или большее число при неудачном исполнении.

Почему это важно? Если смотреть на коды завершения в контексте скриптов для командной строки, ответ очевиден. Любой полезный Bash-скрипт неизбежно будет использоваться в других скриптах или его обернут в однострочник Bash. Это особенно актуально при использовании инструментов автоматизации типа SaltStack или инструментов мониторинга типа Nagios. Эти программы исполняют скрипт и проверяют статус завершения, чтобы определить, было ли исполнение успешным.

Кроме того, даже если вы не определяете коды завершения, они всё равно есть в ваших скриптах. Но без корректного определения кодов выхода можно столкнуться с проблемами: ложными сообщениями об успешном исполнении, которые могут повлиять на работу скрипта.

Что происходит, когда коды завершения не определены

В Linux любой код, запущенный в командной строке, имеет код завершения. Если код завершения не определён, Bash-скрипты используют код выхода последней запущенной команды. Чтобы лучше понять суть, обратите внимание на пример.

Как использовать коды завершения в Bash-скриптах

Проверяем коды завершения

После рефакторинга скрипта получаем такое поведение:

Создаём собственный код завершения

Как использовать коды завершения в командной строке

Скрипт уже умеет сообщать пользователям и программам об успешном или неуспешном выполнении. Теперь его можно использовать с другими инструментами администрирования или однострочниками командной строки.

Скрипт использует коды завершения, чтобы понять, была ли команда успешно выполнена. Если коды завершения используются некорректно, пользователь скрипта может получить неожиданные результаты при неудачном выполнении команды.

Дополнительные коды завершения

Адаптированный перевод статьи Understanding Exit Codes and how to use them in bash scripts by Benjamin Cane. Мнение администрации Хекслета может не совпадать с мнением автора оригинальной публикации.

Источник

Bash-скрипты, часть 5: сигналы, фоновые задачи, управление сценариями

bash прервать выполнение скрипта

В прошлый раз мы говорили о работе с потоками ввода, вывода и ошибок в bash-скриптах, о дескрипторах файлов и о перенаправлении потоков. Сейчас вы знаете уже достаточно много для того, чтобы писать что-то своё. На данном этапе освоения bash у вас вполне могут возникнуть вопросы о том, как управлять работающими скриптами, как автоматизировать их запуск.

bash прервать выполнение скрипта

До сих пор мы вводили имена скриптов в командную строку и нажимали Enter, что приводило к немедленному запуску программ, но это — не единственный способ вызова сценариев. Сегодня мы поговорим о том как скрипт может работать с сигналами Linux, о различных подходах к запуску скриптов и к управлению ими во время работы.

Сигналы Linux

В Linux существует более трёх десятков сигналов, которые генерирует система или приложения. Вот список наиболее часто используемых, которые наверняка пригодятся при разработке сценариев командной строки.

Код сигналаНазваниеОписание
1SIGHUPЗакрытие терминала
2SIGINTСигнал остановки процесса пользователем с терминала (CTRL + C)
3SIGQUITСигнал остановки процесса пользователем с терминала (CTRL + \) с дампом памяти
9SIGKILLБезусловное завершение процесса
15SIGTERMСигнал запроса завершения процесса
17SIGSTOPПринудительная приостановка выполнения процесса, но не завершение его работы
18SIGTSTPПриостановка процесса с терминала (CTRL + Z), но не завершение работы
19SIGCONTПродолжение выполнения ранее остановленного процесса

Если оболочка bash получает сигнал SIGHUP когда вы закрываете терминал, она завершает работу. Перед выходом она отправляет сигнал SIGHUP всем запущенным в ней процессам, включая выполняющиеся скрипты.

Bash-скрипты не контролируют эти сигналы, но они могут распознавать их и выполнять некие команды для подготовки скрипта к последствиям, вызываемым сигналами.

Отправка сигналов скриптам

Оболочка bash позволяет вам отправлять скриптам сигналы, пользуясь комбинациями клавиш на клавиатуре. Это оказывается очень кстати если нужно временно остановить выполняющийся скрипт или завершить его работу.

Завершение работы процесса

Комбинация клавиш CTRL + C генерирует сигнал SIGINT и отправляет его всем процессам, выполняющимся в оболочке, что приводит к завершению их работы.

Выполним в оболочке такую команду:

bash прервать выполнение скрипта

Завершение работы процесса с клавиатуры

Временная остановка процесса

bash прервать выполнение скрипта

Число в квадратных скобках — это номер задания, который оболочка назначает процессу. Оболочка рассматривает процессы, выполняющиеся в ней, как задания с уникальными номерами. Первому процессу назначается номер 1, второму — 2, и так далее.

Если вы приостановите задание, привязанное к оболочке, и попытаетесь выйти из неё, bash выдаст предупреждение.

Просмотреть приостановленные задания можно такой командой:

bash прервать выполнение скрипта

Выглядит её вызов так:

Перехват сигналов

Команда trap позволяет скрипту реагировать на сигналы, в противном случае их обработка выполняется оболочкой без его участия.

Рассмотрим пример, в котором показано, как при вызове команды trap задаётся код, который надо выполнить, и список сигналов, разделённых пробелами, которые мы хотим перехватить. В данном случае это всего один сигнал:

bash прервать выполнение скрипта

Перехват сигнала выхода из скрипта

Перехватить сигнал выхода из скрипта можно, использовав при вызове команды trap имя сигнала EXIT :

bash прервать выполнение скрипта

Перехват сигнала выхода из скрипта

Модификация перехваченных сигналов и отмена перехвата

Для модификации перехваченных скриптом сигналов можно выполнить команду trap с новыми параметрами:

bash прервать выполнение скрипта

Модификация перехвата сигналов

После модификации сигналы будут обрабатываться по-новому.

И нажмём CTRL + C на клавиатуре.

bash прервать выполнение скрипта

Сигнал, перехваченный до отмены перехвата

Выполнение сценариев командной строки в фоновом режиме

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

Запустим его, указав после имени символ амперсанда ( & ):

Это приведёт к тому, что он будет запущен как фоновый процесс.

bash прервать выполнение скрипта

Запуск скрипта в фоновом режиме

Скрипт будет запущен в фоновом процессе, в терминал выведется его идентификатор, а когда его выполнение завершится, вы увидите сообщение об этом.

bash прервать выполнение скрипта

При таком подходе, если выйти из терминала, скрипт, выполняющийся в фоне, так же завершит работу.

Что если нужно, чтобы скрипт продолжал работать и после закрытия терминала?

Выполнение скриптов, не завершающих работу при закрытии терминала

Применим эту методику при запуске нашего скрипта:

Вот что будет выведено в терминал.

bash прервать выполнение скрипта

Просмотр заданий

Команда jobs позволяет просматривать текущие задания, которые выполняются в оболочке. Напишем такой скрипт:

bash прервать выполнение скрипта

Запуск и приостановка скрипта

Запустим тот же скрипт в фоновом режиме, при этом перенаправим вывод скрипта в файл так, чтобы он ничего не выводил на экране:

bash прервать выполнение скрипта

Получение сведений о скриптах

Перезапуск приостановленных заданий

bash прервать выполнение скрипта

Теперь скрипт выполняется в фоновом режиме.

Если у вас имеется несколько приостановленных заданий, для перезапуска конкретного задания команде bg можно передать его номер.

Для перезапуска задания в обычном режиме воспользуйтесь командой fg :

Планирование запуска скриптов

Вызов команды at выглядит так:

Эта команда распознаёт множество форматов указания времени.

bash прервать выполнение скрипта

Планирование заданий с использованием команды at

Для того чтобы посмотреть список заданий, ожидающих выполнения, можно воспользоваться командой atq :

bash прервать выполнение скрипта

Список заданий, ожидающих выполнения

Удаление заданий, ожидающих выполнения

bash прервать выполнение скрипта

Запуск скриптов по расписанию

Планирование однократного запуска скриптов с использованием команды at способно облегчить жизнь во многих ситуациях. Но как быть, если нужно, чтобы скрипт выполнялся в одно и то же время ежедневно, или раз в неделю, или раз в месяц?

Crontab выполняется в фоне и, основываясь на данных в так называемых cron-таблицах, запускает задания по расписанию.

При планировании запуска скрипта по расписанию crontab принимает данные о том, когда нужно выполнить задание, в таком формате:

Например, если надо, чтобы некий скрипт с именем command выполнялся ежедневно в 10:30, этому будет соответствовать такая запись в таблице заданий:

Здесь универсальный символ « * », использованный для полей, задающих день месяца, месяц и день недели, указывает на то, что cron должен выполнять команду каждый день каждого месяца в 10:30.

Если, например, надо, чтобы скрипт запускался в 4:30PM каждый понедельник, понадобится создать в таблице заданий такую запись:

Нумерация дней недели начинается с 0, 0 означает воскресенье, 6 — субботу. Вот ещё один пример. Здесь команда будет выполняться в 12 часов дня в первый день каждого месяца.

Затем можно вводить команды формирования расписания:

Благодаря этой команде скрипт будет вызываться ежедневно в 10:30. Если вы столкнётесь с ошибкой «Resource temporarily unavailable», выполните нижеприведённую команду с правами root-пользователя:

Организовать периодический запуск скриптов с использованием cron можно ещё проще, воспользовавшись несколькими специальными директориями:

Если поместить файл скрипта в одну из них, это приведёт, соответственно, к его ежечасному, ежедневному, еженедельному или ежемесячному запуску.

Запуск скриптов при входе в систему и при запуске оболочки

Автоматизировать запуск скриптов можно, опираясь на различные события, такие, как вход пользователя в систему или запуск оболочки. Тут можно почитать о файлах, которые обрабатываются в подобных ситуациях. Например, это следующие файлы:

Итоги

Сегодня мы разобрали вопросы, касающиеся управления жизненным циклом сценариев, поговорили о том, как запускать скрипты в фоне, как планировать их выполнение по расписанию. В следующий раз читайте о функциях в bash-скриптах и о разработке библиотек.

Уважаемые читатели! А вы пользуетесь средствами планирования запуска сценариев командной строки по расписанию? Если да — расскажите пожалуйста о них.

Источник

Команда exit в Bash и коды выхода

Часто при написании сценариев Bash вам необходимо завершить сценарий при выполнении определенного условия или выполнить действие на основе кода выхода команды.

В этой статье мы рассмотрим встроенную команду exit Bash и статусы выхода выполненных команд.

Статус выхода

Каждая команда оболочки возвращает код выхода, когда она завершается успешно или безуспешно.

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

Команда date завершена успешно, код выхода равен нулю:

Если вы попытаетесь запустить ls в несуществующем каталоге, код выхода будет отличным от нуля:

Код состояния можно использовать для выяснения причины сбоя команды. На странице руководства каждой команды содержится информация о кодах выхода.

При выполнении многокомандного конвейера статус выхода конвейера соответствует состоянию последней команды:

Команда exit

Команда exit закрывает оболочку со статусом N Он имеет следующий синтаксис:

Если N не задано, код состояния выхода — это код последней выполненной команды.

При использовании в сценариях оболочки значение, указанное в качестве аргумента команды exit возвращается оболочке как код выхода.

Примеры

При запуске списка команд, разделенных && (И) или || (ИЛИ), статус выхода команды определяет, будет ли выполнена следующая команда в списке. Здесь команда mkdir будет выполнена, только если cd вернет ноль:

Если сценарий завершается exit без указания параметра, код выхода из сценария — это код последней команды, выполненной в сценарии.

Вот пример, показывающий, как завершить сценарий, если он запущен пользователем без полномочий root:

Выводы

Каждая команда оболочки возвращает код выхода при завершении. Команда exit используется для выхода из оболочки с заданным статусом.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.

Источник

bash exit script from function

как завершить функцию и чтобы при этом завершился сам скрипт и дальше не продолжался.

exit завершает только саму функцию.

bash прервать выполнение скрипта

bash прервать выполнение скрипта

не работает у меня так. (

правда я вызываю функцию

bash прервать выполнение скрипта

получается я скрипт функцию выполняю через ssh на другом сервере

./deploy1.sh
в функции
после функции

bash прервать выполнение скрипта

А зачем ты переменной присваиваешь строку с описанной функцией? Я не специалист по башу, но эти танцы с бубном я не понял.

bash прервать выполнение скрипта

bash прервать выполнение скрипта

я хчоу чтобы при завершении функции с ошибкой команда

bash прервать выполнение скрипта

иначе не работает. для работы по ssh

Объясни, что ты в итоге хочешь сделать. С примером.

bash прервать выполнение скрипта

хочу запускать функцию по очереди на разных серверах для своих мелких задач

Скрипт, который за тебя выполняет функцию после подключения по ssh?

bash прервать выполнение скрипта

Но тут получается, что функцию-то ты передаешь по ssh, но и завершение происходит на стороне сервера. Чтобы завершить выполнение скрипта на стороне хоста придется функцию запускать локально

или завершать вне функции. Других вариантов не знаю.

bash прервать выполнение скрипта

bash прервать выполнение скрипта

как передать исключение? и обработать

Читай до конца пост.

bash прервать выполнение скрипта

Тогда если серверов несколько выполнит функцию только на первом и выйдет из скрипта.

bash прервать выполнение скрипта

А что он вообще хочет-то? Разве не выйти из скрипта?

Он хочет в функции выйти из скрипта, когда функция выполняется удаленно на сервере, насколько я понял. Правда не знаю зачем.

bash прервать выполнение скрипта

Тогда если серверов несколько выполнит функцию только на первом и выйдет из скрипта.

Он хочет в функции выйти из скрипта, когда функция выполняется удаленно на сервере, насколько я понял.

А я что предлагаю? Выйти из скрипта, по exit 0 в функции запущенной на другом хосте :). Не понятно правда почему у него exit 0, а не exit 1 например.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *