Vous avez peu d'options. L'une consiste à arrêter le script ( CtrlZ), à obtenir le PID du script et à l'envoyer SIGKILLau groupe de processus.
Lorsqu'une commande est exécutée dans un shell, le processus qu'il démarre et tous ses enfants font partie du même groupe de processus (dans ce cas, le groupe de processus de premier plan). Pour envoyer un signal à tous les processus de ce groupe, vous l'envoyez au responsable du processus. Pour la killcommande, le responsable de processus est noté:
kill -PID
Où se PIDtrouve l'ID de processus du script.
Exemple:
Prenons un script test.shqui lance certains processus. Disons que vous l'avez couru dans un shell:
$ ./test.sh
Dans un autre terminal,
$ 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)
Dans ce cas, pour envoyer un signal au groupe de processus créé par test.sh, vous devez:
kill -INT -17802
-INTest utilisé pour envoyer SIGINT, et cette commande équivaut donc à appuyer CtrlCsur le terminal. Pour envoyer SIGKILL:
kill -KILL -17802
Vous ne devez arrêter le script que si vous ne pouvez pas ouvrir un autre terminal. Si vous le pouvez, utilisezpgrep pour trouver le PID.
L'une des commandes lancées par le script peut être un interception SIGINT, ce qui explique probablement CtrlCson inefficacité. Cependant, SIGKILLvous ne pouvez pas être pris au piège et il s’agit généralement d’une solution de dernier recours . Vous voudrez peut-être essayer SIGTERM( -TERM) avant de vous lancer. Ni SIGKILLou SIGTERMpeut être configuré comme un raccourci clavier comme SIGINTest.
Tout cela n'a plus sa raison d'être si votre script ne contient pas de ligne shebang. De cette réponse SO :
Généralement, le shell parent suppose que le script est écrit pour le même shell (des shells de type Bourne ressemblent au script avec / bin / sh, bash l'exécute en tant que sous-processus bash) ...
De ce fait, lorsque le script est exécuté, vous ne trouverez pas de processus nommé d'après le script (ni un processus avec le nom du script dans la ligne de commande) et pgrepéchouera.
Toujours utiliser une ligne de shebang.
Ctrl + z