Как остановить скрипт bash в терминале?
Программа sl намеренно игнорирует SIGINT , который отправляется при нажатии Ctrl + C . Итак, во-первых, вам нужно указать sl не игнорировать SIGINT , добавив аргумент -e .
Если вы попробуете это, вы заметите, что вы можете остановить каждый отдельный sl , но они все равно повторяются. Вы должны указать bash для выхода после SIGINT . Вы можете сделать это, поставив trap «exit» INT перед циклом.
- нажмите Ctrl-Z , чтобы приостановить выполнение сценария.
- kill %%
%% сообщает bash встроенный kill , который вы хотите отправить сигнал (SIGTERM по умолчанию), к самому недавно приостановленному фонового задания в текущей оболочке , а не идентификатор процесса.
Вы также можете указать задания по номеру или по имени. например когда вы приостанавливаете задание с помощью ^ Z, bash сообщит вам, что его номер задания с чем-то вроде [n]+ Stopped , где n внутри квадратных скобок является номер задания.
Для получения дополнительной информации об управлении заданиями и заданиях по убийству выполните справки по help jobs , help fg , help bg и help kill в bash и выполните поиск JOB CONTROL (все кепки) или jobspec на странице man bash.
В этом примере номер задания равен 1, поэтому kill %1 работал бы так же, как kill %%
(ПРИМЕЧАНИЕ: у меня нет sl , так что выход просто «команда не найдена». В вашем случае вы получите то, что производит выходной файл. Это не важно — код> ^ Z suspend и ^Z будет работать одинаково)
Вы можете завершить этот скрипт, нажав Ctrl + C с терминала, на котором вы начали этот скрипт. Конечно, этот скрипт должен работать на переднем плане, поэтому вы можете остановить его с помощью Ctrl + C.
Или вы можете найти PID (идентификатор процесса) этого скрипта в другом открытом терминале с помощью:
Оба способа должны делать трюк, о котором вы просите.
Если вы хотите, чтобы ctrl + c остановил цикл, но не завершил сценарий, вы можете поместить || break после выполнения любой команды. Пока программа, которую вы запускаете, заканчивается на ctrl + c, это отлично работает.
Если вы находитесь в вложенном цикле, вы можете использовать «break 2», чтобы выйти из двух уровней и т. д.
Самый простой способ — вывести сигнал QUIT , который обычно прикрепляется к Control-Backslash .
Когда вы увидите поезд, нажмите Control — \
Вы можете kill pid оболочки (bash).
Я просто попробовал, и это работает.
Потому что я не вижу процесс из ps -ef (задание, которое мы запускаем в скрипте цикла).
Как остановить цикл скрипт bash в терминале?
Программа sl намеренно игнорирует то SIGINT , что отправляется при нажатии Ctrl+C . Итак, во-первых, вам нужно сказать sl не игнорировать SIGINT , добавив -e аргумент.
Если вы попробуете это, вы заметите, что можете остановить каждого человека sl , но они все еще повторяются. Вы должны сказать, bash чтобы выйти после того, SIGINT как. Вы можете сделать это, поставив trap «exit» INT перед циклом.
- нажмите, Ctrl-Z чтобы приостановить сценарий
- kill %%
%% Говорит Баш встроенного в kill том , что вы хотите , чтобы послать сигнал (SIGTERM по умолчанию) в последнее время приостановлено фоновое задание в текущей оболочке, а не на идентификатор процесса.
Вы также можете указать работу по номеру или по названию. например, когда вы приостанавливаете работу с помощью ^ Z, bash сообщит вам, каков номер его работы с чем-то вроде того [n]+ Stopped , где n внутри квадратных скобок указан номер работы.
Для получения дополнительной информации о контроле работы и на убийство рабочих мест, бег help jobs , help fg , help bg , и help kill в Баше и поиск JOB CONTROL (заглавные буквы) или jobspec на странице Баша человека.
В этом примере номер задания был 1, поэтому kill %1 работал бы так же, как kill %%
(ПРИМЕЧАНИЕ: я не sl установил, так что вывод — это просто «команда не найдена». В вашем случае вы получите то, что выдаст sl. Это не важно — ^Z приостановка и kill %% будет работать так же)
Как прервать выполнение процесса в скрипте
Как прервать выполнение процесса в скрипте, как по Ctrl+C ?
Re: Как прервать выполнение процесса в скрипте
man 1 kill если надо точно также как по Ctrl+C, то по этому сочетанию процессу посылаеться сигнал SIGINT, тоесть сигнал №3 Тогда соответственно или
kill -SIGINT $PID
где $PID номер процесса
А еще более правильно
kill -SIGINT -$GID
то есть группе процессов, так как Ctrl+C посылает сигнал не одному процессу,а группе
Re: Re: Как прервать выполнение процесса в скрипте
Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока он не остановиться, невозможно выполнить следующую команду. Как его остановить?
Re: Re: Re: Как прервать выполнение процесса в скрипте
Поправлюсь:
Немного не так поставил вопрос. Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Скрипт запускает процесс на выполнение. И соответственно пока этот процесс не остановиться, невозможно выполнить следующую команду в скрипте. Как его остановить?
А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать "как по ^C" собрался)?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Запускай процесс в фоне 🙂
а потом если захочешь его убить
Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
>>А зачем запускать процесс, который вообще не нужен (ты ж его сразу грохать "как по ^C" собрался)?
Чего то меня последнее время напрягаю вопросы типа "А зачем"
Может ему этот процесс надо на пару секунд
Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
> Чего то меня последнее время напрягаю вопросы типа "А зачем" Может ему этот процесс надо на пару секунд
А в твоем примере PID=$1 или PID=$! ?
А kill -9 или kill -2 (SIGINT)?
А твоя фамилия не Ностердамус?

Re: Как прервать выполнение процесса в скрипте
форкнуться на два процесса парент-чайлд, потом следить по таймаутам, например, чего и как. Или сделать 2 канала (парент-чайлд и чайлд-парент) между процессами для обмена информацией.
Re: Re: Как прервать выполнение процесса в скрипте
Этот процесс не работает в фоне. 🙁
Re: Re: Re: Как прервать выполнение процесса в скрипте
>>Этот процесс не работает в фоне. 🙁
Он читает что-то с терминала?
Re: Как прервать выполнение процесса в скрипте
Ты что, издеваешься, или решил в "Что?Где?Когда?" поиграть?
Сформулируй, наконец, свой вопрос.
Re: Re: Как прервать выполнение процесса в скрипте
Re: Re: Re: Как прервать выполнение процесса в скрипте
>>No togda kill ub’et _VSE_ processy gde budet vstrechat’sya imya tvoego processa.
Ну тогда сразу killall -9 my_process, чего мелочиться!! 😉
Кстати, никто не пробывал посылать из под рута SIGKILL иниту?
Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Nesk (*) (28.06.2004 19:49:44):
> Кстати, никто не пробывал посылать из под рута SIGKILL иниту?
Стандартный вопрос "на засыпку" 🙂
Можешь смело посылать, ничего не будет: init не имеет обработчиков сигналов.
Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
2idle (*) (28.06.2004 20:46:46):
Странно. Может, это — новый Деним Торнадо Автешейв?
У меня в linux-2.4.19.SuSE/kernel/ никакого упоминания о get_signal_to_deliver не содержится.
С другой стороны, man 2 kill:
It is impossible to send a signal to task number one, the init process, for which it has not installed a signal handler. This is done to assure the system is not brought down accidentally.
Re: Re: Как прервать выполнение процесса в скрипте
Спасибо всем, вроде немного разобрался.
Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
Re: Re: Re: Re: Re: Re: Re: Re: Как прервать выполнение процесса в скрипте
idle (*) (29.06.2004 12:43:48):
>собственно, что я придрался к тому, что:
>> init не имеет обработчиков сигналов.
Ну, я никогда в ядро на эту тему не лазил, просто верил цитированным строчкам из мануала:
> . for which it has not installed a signal handler.
Чой-то я не могу найти исходников init’а.
Из ядерного кода я понял только, что в ините не выставляются обработчики по умолчанию:
if (ka->sa.sa_handler == SIG_DFL) <
/* Init gets no signals it doesn’t want. */
if (current->pid == 1)
Наверное, это и имеется в виду: init имеет только те обработчики, которые САМ выставил.