Vous avez peu d'options. L'une consiste à arrêter le script ( CtrlZ), à obtenir le PID du script et à l'envoyer SIGKILL
au 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 kill
commande, le responsable de processus est noté:
kill -PID
Où se PID
trouve l'ID de processus du script.
Exemple:
Prenons un script test.sh
qui 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
-INT
est 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, SIGKILL
vous 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 SIGKILL
ou SIGTERM
peut être configuré comme un raccourci clavier comme SIGINT
est.
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