Я написал скрипт bash, который вызывает несколько других программ и выполняет несколько команд. Я запускаю этот скрипт из терминала. Теперь я хочу убить сценарий.
Ctrl + C
Я думаю, что нажатие иногда не обрезает его, потому что иногда скрипт выполняет другую программу, и по какой-то причине сигнал kill не работает.
Однако, если я закрываю окно терминала, это убивает скрипт.
Есть ли что-то, что я могу сделать (комбинация клавиш), аналогично закрытию окна терминала, без фактического закрытия окна терминала (я не хочу терять историю команд, текущий каталог, историю вывода и т. Д.)?
Ctrl + z
Ctrl + z
запуска:kill -9 $(pgrep -f your_script.sh)
Ответы:
У вас есть несколько вариантов. Один из них - остановить скрипт ( CtrlZ), получить PID скрипта и отправить
SIGKILL
в группу процессов.Когда команда выполняется в оболочке, процесс, который она запускает, и все ее дочерние элементы являются частью одной группы процессов (в данном случае, группы процессов переднего плана). Чтобы отправить сигнал всем процессам в этой группе, вы отправляете его руководителю процесса. Для
kill
команды лидер процесса обозначается так:Где
PID
находится идентификатор процесса скрипта.Пример:
Рассмотрим скрипт,
test.sh
который запускает некоторые процессы. Скажем, вы запустили его в оболочке:В другом терминале
В этом случае, чтобы отправить сигнал группе процессов, созданной
test.sh
, вы должны сделать:-INT
используется для отправкиSIGINT
, и поэтому эта команда эквивалентна нажатию CtrlCна терминал. ОтправитьSIGKILL
:Вам нужно остановить скрипт, только если вы не можете открыть другой терминал. Если вы можете, используйте,
pgrep
чтобы найти PID.Одной из команд, запускаемых сценарием, может быть прерывание
SIGINT
, поэтому, вероятно, CtrlCоно неэффективно. ТемSIGKILL
не менее, не может быть пойман в ловушку, и это, как правило, последний вариант. Возможно, вы захотите попробоватьSIGTERM
(-TERM
), прежде чем идти на убийство. НиSIGKILL
илиSIGTERM
не может быть установлен как клавиатура ярлыка путиSIGINT
есть.Все это спорный вопрос , если ваш сценарий не содержит притон линии. Из этого так ответьте :
Из-за этого при выполнении сценария вы не найдете процесс, названный в соответствии со сценарием (или процесс с именем сценария в командной строке), и
pgrep
произойдет сбой.Всегда используйте линию Шебанга.
источник
SIGKILL
илиSIGTERM
?pgrep test.sh
не возвращает PID для меня. Я попробовал простой test.sh: воfor i in {1..30}; do sleep 1 echo $i done
времяtest.sh
работы я выполняюpgrep test.sh
в другом терминале, но ничего не возвращается. В чем дело?pgrep -f test.sh
.pgrep -f test.sh
тоже не работает Я запускаю сценарий с./test.sh
Если вы знаете процессы, связанные со сценарием, вы можете найти их PID, используя
а затем использовать номер PID, чтобы убить соответствующие процессы, используя
источник
Как сказал Харрис, вы можете запустить,
Kill -9 PID_Number
но вы также можете установить пакет, известный какhtop
интерактивный браузер процессов, который значительно упрощает поиск определенных процессов. htop также поддерживает процессы уничтожения.источник