Я записал сценарий удара, который называет несколько других программ и выполняет набор команд. Я запускаю этот скрипт от терминала. Теперь я хочу уничтожить сценарий.
Нажатие Ctrl + C
иногда не сокращает его, я думаю, потому что иногда сценарий выполняет другую программу, и по некоторым причинам сигнал уничтожения не работает.
Однако, если я закрываю окно терминала, оно уничтожает сценарий.
Есть ли что-то, что я могу сделать (комбинация клавиатуры), который походит на закрытие окна терминала, на самом деле не закрывая окно терминала (я не хочу терять историю команд, текущий каталог, выходную историю, и т.д.)?
У Вас есть немного опций. Нужно остановить сценарий (CtrlZ), получить PID сценария и отправить SIGKILL
группе процесса.
Когда команда выполняется в оболочке, процесс, который она запускает, и все его дети являются частью той же группы процесса (в этом случае, группы приоритетного процесса). Для отправки сигнала во все процессы в этой группе Вы отправляете его лидеру процесса. Для kill
команда, лидер процесса обозначен таким образом:
kill -PID
Где PID
идентификатор процесса сценария.
Пример:
Рассмотрите сценарий test.sh
который запускает некоторые процессы. Скажите выполнение его в оболочке:
$ ./test.sh
В другом терминале,
$ pgrep test.sh
17802
$ pstree -ps `!!`
pstree -ps `pgrep test.sh`
init(1)───sshd(1211)───sshd(17312)───sshd(17372)───zsh(17788)───test.sh(17802)─┬─dd(17804)
├─sleep(17805)
└─yes(17803)
В этом случае, для отправки сигнала обработать группу, созданную test.sh
, Вы сделали бы:
kill -INT -17802
-INT
используется для отправки SIGINT
, и таким образом, эта команда является эквивалентом нажатия CtrlC на терминале. Отправить SIGKILL
:
kill -KILL -17802
Только необходимо остановить сценарий, если Вы не можете открыть другой терминал. Если Вы можете, использовать pgrep
найти PID.
Одна из команд, которые могут захватывать запуски сценария SIGINT
, который является, вероятно, почему CtrlC неэффективен. Однако SIGKILL
не может быть захвачен, и это обычно - опция последнего средства. Вы могли бы хотеть попробовать SIGTERM
(-TERM
) прежде, чем идти для уничтожения. Ни один SIGKILL
или SIGTERM
может быть настроен как сочетание клавиш путь SIGINT
.
Все это спорно, если Ваш сценарий не содержит строку хижины. От этого ТАК ответьте:
Обычно родительская оболочка предполагает, что сценарий записан для та же оболочка (минимальные подобные Границе оболочки запускают скрипт с/bin/sh, колотят, выполняет его как подпроцесс удара)...
Из-за этого, когда сценарий будет выполняться, Вы не найдете процесс названными в честь сценария (или процесс с названием сценария в командной строке) и pgrep
перестанет работать.
Всегда используйте строку хижины.
Если Вы знаете процессы, которые связаны со сценарием, можно найти их PID с помощью
ps -A
и затем использовать число PID для уничтожения соответствующих процессов с помощью
kill -9 PID_Number
Поскольку Harris сказал, что Вы могли работать Kill -9 PID_Number
, но Вы могли также установить пакет, известный как htop
для имения интерактивного браузера процесса, который делает находящие определенные процессы намного легче. htop также поддерживает процессы уничтожения.