Hai poche opzioni. Uno è quello di interrompere lo script ( CtrlZ), ottenere il PID dello script e inviarlo SIGKILL
al gruppo di processi.
Quando un comando viene eseguito in una shell, il processo inizia e tutti i suoi figli fanno parte dello stesso gruppo di processi (in questo caso, il gruppo di processi in primo piano). Per inviare un segnale a tutti i processi in questo gruppo, lo si invia al leader del processo. Per il kill
comando, il leader del processo è indicato in questo modo:
kill -PID
Dov'è PID
l'ID del processo dello script.
Esempio:
Considera uno script test.sh
che avvia alcuni processi. Supponi di averlo eseguito in una shell:
$ ./test.sh
In un altro terminale,
$ 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)
In questo caso, per inviare un segnale al gruppo di processo creato da test.sh
, è necessario:
kill -INT -17802
-INT
viene utilizzato per inviare SIGINT
, quindi questo comando equivale a premere CtrlCsul terminale. Per inviare SIGKILL
:
kill -KILL -17802
Devi solo interrompere lo script se non riesci ad aprire un altro terminale. Se puoi, usa pgrep
per trovare il PID.
Uno dei comandi lanciati dallo script potrebbe essere in trappola SIGINT
, motivo per cui è probabilmente CtrlCinefficace. Tuttavia, SIGKILL
non può essere intrappolato ed è di solito un'opzione di ultima istanza . Potresti voler provare SIGTERM
( -TERM
) prima di andare per l'uccisione. Né SIGKILL
oppure SIGTERM
può essere impostato come un scorciatoia da tastiera il modo SIGINT
è.
Tutto questo è discutibile se la tua sceneggiatura non contiene una riga shebang. Da questa risposta SO :
Di solito la shell genitore indovina che lo script è scritto per la stessa shell (le shell minimali tipo Bourne eseguono lo script con / bin / sh, bash lo esegue come sottoprocesso bash) ...
Per questo motivo, quando lo script viene eseguito, non troverai un processo che prende il nome dallo script (o un processo con il nome dello script nella riga di comando) e pgrep
fallirà.
Usa sempre una linea shebang.
Ctrl + z