Hai poche opzioni. Uno è quello di interrompere lo script ( CtrlZ), ottenere il PID dello script e inviarlo SIGKILLal 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 killcomando, il leader del processo è indicato in questo modo:
kill -PID
Dov'è PIDl'ID del processo dello script.
Esempio:
Considera uno script test.shche 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
-INTviene 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 pgrepper trovare il PID.
Uno dei comandi lanciati dallo script potrebbe essere in trappola SIGINT, motivo per cui è probabilmente CtrlCinefficace. Tuttavia, SIGKILLnon può essere intrappolato ed è di solito un'opzione di ultima istanza . Potresti voler provare SIGTERM( -TERM) prima di andare per l'uccisione. Né SIGKILLoppure SIGTERMpuò 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 pgrepfallirà.
Usa sempre una linea shebang.
Ctrl + z