Як вбити сценарій, що працює в терміналі, не закриваючи термінал (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.