Як вбити сценарій, що працює в терміналі, не закриваючи термінал (Ctrl + C не працює)?


36

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

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

Однак якщо я закрию вікно терміналу, це вбиває сценарій.

Чи можу я щось зробити (комбінація клавіатури), аналогічно закриттю вікна терміналу, фактично не закриваючи вікно терміналу (я не хочу втрачати історію команд, поточний каталог, історію виводу тощо)?


8
У таких випадках я пробуюCtrl + z
kenn

І після Ctrl + zзапуску:kill -9 $(pgrep -f your_script.sh)
Ноам Манос

Відповіді:


38

У вас мало варіантів. Одне - зупинити скрипт ( 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 .

Все це спірно, якщо ваш сценарій не містить рядка shebang. З цієї відповіді ТА :

Зазвичай батьківська оболонка здогадується, що сценарій написаний для тієї самої оболонки (мінімальні оболонки, подібні Борну, запускають сценарій з / bin / sh, bash запускає його як підпроцес bash) ...

Через це, коли сценарій виконується, ви не знайдете процес, названий по скрипту (або процес із ім'ям сценарію в командному рядку) і pgrep не вдасться.

Завжди використовуйте лінію shebang.


Чи існує комбінація клавіатур для SIGKILLабо SIGTERM?
бекко

@becko Ні, і ви не можете його налаштувати: superuser.com/a/417991/334516
muru

pgrep test.shне повертає PID для мене. Я спробував простий test.sh: for i in {1..30}; do sleep 1 echo $i done Поки test.shпрацює, я виконую pgrep test.shв іншому терміналі, але нічого не повертається. Що не так?
бекко

1
@becko як ти запустив сценарій? Також спробуйте pgrep -f test.sh.
muru

pgrep -f test.shтеж не працює. Я запускаю сценарій з./test.sh
бекко

6

Якщо ви знаєте процеси, пов'язані зі сценарієм, ви можете знайти їх PID, використовуючи

 ps -A

а потім використовуйте номер PID, щоб знищити відповідні процеси за допомогою

 kill -9 PID_Number

1
Це занадто складно. Сценарій породжує кілька інших програм, і ці програми також породжують паралельні процеси. Дуже важко відстежувати всі ці процеси. Має бути більш просте рішення, щось аналогічне тому, що відбувається, коли ви закриєте вікно терміналу.
бекко

Чи можете ви спробувати pkill -P $$
Harris

1

Як сказав Гарріс, ви можете запустити, Kill -9 PID_Numberале ви також можете встановити пакунок, відомий як htopінтерактивний браузер процесів, що значно спрощує пошук конкретних процесів. htop також підтримує процеси вбивства.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.