Как уничтожить сценарий, работающий в терминале, без заключительного терминала (Ctrl + C не работает)?

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

Нажатие Ctrl + C иногда не сокращает его, я думаю, потому что иногда сценарий выполняет другую программу, и по некоторым причинам сигнал уничтожения не работает.

Однако, если я закрываю окно терминала, оно уничтожает сценарий.

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

35
задан 4 September 2014 в 19:49

3 ответа

У Вас есть немного опций. Нужно остановить сценарий (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 перестанет работать.

Всегда используйте строку хижины.

38
ответ дан 16 November 2019 в 11:02

Если Вы знаете процессы, которые связаны со сценарием, можно найти их PID с помощью

 ps -A

и затем использовать число PID для уничтожения соответствующих процессов с помощью

 kill -9 PID_Number
6
ответ дан 16 November 2019 в 11:02

Поскольку Harris сказал, что Вы могли работать Kill -9 PID_Number, но Вы могли также установить пакет, известный как htop для имения интерактивного браузера процесса, который делает находящие определенные процессы намного легче. htop также поддерживает процессы уничтожения.

1
ответ дан 16 November 2019 в 11:02

Другие вопросы по тегам:

Похожие вопросы: