Как остановить скрипт в linux
Перейти к содержимому

Как остановить скрипт в linux

Как остановить скрипт bash в терминале?

Программа sl намеренно игнорирует SIGINT , который отправляется при нажатии Ctrl + C . Итак, во-первых, вам нужно указать sl не игнорировать SIGINT , добавив аргумент -e .

Если вы попробуете это, вы заметите, что вы можете остановить каждый отдельный sl , но они все равно повторяются. Вы должны указать bash для выхода после SIGINT . Вы можете сделать это, поставив trap «exit» INT перед циклом.

  1. нажмите Ctrl-Z , чтобы приостановить выполнение сценария.
  2. 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 перед циклом.

  1. нажмите, Ctrl-Z чтобы приостановить сценарий
  2. 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 имеет только те обработчики, которые САМ выставил.

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

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