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