linux не закрывать терминал после выполнения скрипта

Закрыть окно терминала после удачного выполнения скрипта.

Пытаюсь адаптировать скрипт для запуска nmap под xfce от root. Требуется, чтобы по завершению авторизации, окно терминала само закрывалось, не закрывая работающую программу. Сейчас это выглядит так:

linux не закрывать терминал после выполнения скрипта

linux не закрывать терминал после выполнения скрипта

А откуда взять данные для переменной? Я в баше вообще не силён, максимум что-то подправить могу на интуитивном уровне.

linux не закрывать терминал после выполнения скрипта

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

linux не закрывать терминал после выполнения скрипта

А негде брать. Ман крайне скудный да и буквально на один раз нафиг не надо, проще спросить.

linux не закрывать терминал после выполнения скрипта

linux не закрывать терминал после выполнения скрипта

linux не закрывать терминал после выполнения скрипта

Оно само там будет.

linux не закрывать терминал после выполнения скрипта

дружище, ну какого еще «удачного»? Ты что, кости бросаешь? УСПЕШНОГО.

linux не закрывать терминал после выполнения скрипта

nohup: ввод игнорируется, вывод добавляется в ‘nohup.out’ Далее выдаёт, что нет такого, как «>/dev/null»

linux не закрывать терминал после выполнения скрипта

linux не закрывать терминал после выполнения скрипта

Я не собираюсь вступать с тобой в полемику, болезненный

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

linux не закрывать терминал после выполнения скрипта

Re: Я не собираюсь вступать с тобой в полемику, болезненный

Источник

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

linux не закрывать терминал после выполнения скрипта

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

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

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

linux не закрывать терминал после выполнения скрипта

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итоги

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

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

Источник

Выйти из терминала после запуска сценария bash

Я пытаюсь написать скрипт bash для открытия определенных файлов (в основном файлов PDF) с помощью команды gnome-open. Я также хочу, чтобы терминал выходил, когда он открывает файл pdf.

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

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

6 ответов

Этот скрипт завершает терминал и, следовательно, оболочку и себя.

Он беспощадно убивает все процессы. Если в терминале открыто несколько вкладок, они также закрыты.

Он безжалостно убивает все процессы. Если в терминале открыто несколько вкладок, то они также закрыты.

В этом случае сценарий должен запускаться в независимом терминале, например xterm

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

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

exec: Пример

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

И в терминале я запускаю:

Это печатает цифры 5, 4, 3, 2 и 1, по одному в секунду, а затем закрывается окно терминала.

Если вы не хотите, чтобы ваша оболочка заменила себя новый процесс (через exec), вы можете сказать, что он придерживается, но выходите сразу после завершения нового процесса.

Для этого запустите команду и команду exit, разделенные [ f20], поэтому они могут быть заданы на одной строке.

command; exit vs. command && exit

Какой из них вы хотите, зависит от конкретной ситуации. Если команда не удалась, вы хотите, чтобы вызывающая оболочка (и хостинг-терминал) не вставала? Если это так, используйте &&; Если нет, используйте ;.

Существует также command || exit, который выходит из вызывающей оболочки только в том случае, если command сообщает об ошибке.

Источник

Как закрыть терминал без убийства запущенной в нём команды

Иногда нужно «отвязать» программа от окна терминала, в котором она запущена. Например, вы подключились к удалённому серверу по SSH, запустили задачу, которая не является демоном, но выполнение которой требует большого времени (может быть дни и месяцы). Если вы закроете терминал или просто оборвёте SSH сессию, то запущенная программа попросту прекратит свою работу.

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

В этой статье описаны варианты, как закрыть терминал без остановки запущенной в нём программы.

Для этого есть два решения:

Давайте разберёмся, а в чём различия между

Давайте для начала взглянем, что происходит, когда команда запускается из интерактивной оболочки (подключённой к терминалу) без & (и без какого либо перенаправления). Поэтому давайте предположим, что вы напечатали просто foo (в качестве примера команды), тогда:

Теперь давайте посмотрим, что происходит, когда мы переводим процесс в фон, это делается набором foo &:

Теперь disown удаляет задачу из списка задач оболочки, следовательно все приведённые выше подпункты больше не применяются (включая отправку оболочкой процессу сигнала SIGHUPl). Тем не менее, помните, что он всё ещё подключён к терминалу, поэтому если терминал разрушен (что может случиться если это был pty, как те, которые создаются xtermor или ssh, и контролирующая программа завершена закрытием xterm или закрытием SSH-подключения), программа потерпит неудачу, как только она попытается прочитать из стандартного ввода или записать в стандартный вывод.

Что делает nohup, с одной стороны, она активно отделяет процесс от терминала:

Помните, что nohup не удаляет процесс из контроля задач оболочки и также не переводит его в фон (но поскольку задача nohup на переднем плане практически бесполезно, то обычно она запускается с использованием &). Например, в отличие от disown, оболочка всё ещё будет говорит вам, когда задача nohup завершена (конечно, если оболочка не закрылась раньше этого).

Если использовать вместе все три disown, nohup и &, то процесс будет запущен в фоне, удалён из контроля задач оболочки и эффективно отключён от терминала.

nohup выполняет КОМАНДУ игнорируя сигналы обрыва терминальной линии.

Возможные опции nohup:

Если стандартный ввод является терминалом, то он берётся из нечитаемого файла.

Если стандартный вывод является терминалом, то вывод добавляется в «nohup.out», если возможно, иначе в «$HOME/nohup.out».

Если стандартный поток ошибок является терминалом, то он перенаправляет в стандартный вывод. Чтобы записать вывод в ФАЙЛ, используйте «nohup КОМАНДА > ФАЙЛ».

ЗАМЕЧАНИЕ: ваша оболочка может предоставлять свою версию nohup, которая обычно перекрывает версию, описанную здесь. Пожалуйста, обращайтесь к документации по вашей оболочке, чтобы узнать, какие ключи она поддерживает.

Источник

Выход из терминала после запуска скрипта bash

Я пытаюсь написать bash скрипт для открытия определенных файлов (в основном PDF-файлов) с помощью gnome-open команды. Я также хочу, чтобы терминал завершил работу после открытия файла PDF.

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

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

Если вы хотите выполнить exit после команды или после цепочки команд, вы можете связать ее с тем, что у вас уже есть, с помощью && оператора (который при успешном выполнении предыдущей команды / цепочки команд выполнит следующую команду) или с помощью ; оператор (который как при успешном, так и при неудачном завершении предыдущей команды / цепочки команд выполнит следующую команду).

В этом случае это будет что-то вроде этого:

Или, если скрипт находится в текущем рабочем каталоге Терминала, вот так:

Это отправит SIGKILL сигнал родительскому процессу сценария ( bash экземпляр связан с Терминалом). Если только один bash экземпляр связан с Терминалом, то уничтожение приведет к тому, что Терминал закроется сам. Если bash с Терминалом связано несколько экземпляров, то уничтожение не приведет к закрытию Терминала.

Источник

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

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