J'ai écrit un script bash qui appelle plusieurs autres programmes et exécute un tas de commandes. Je lance ce script depuis le terminal. Maintenant, je veux tuer le script.
Pressage Ctrl + C
parfois ne suffit pas, je pense, car parfois, le script exécute un autre programme et, pour une raison quelconque, le signal de suppression ne fonctionne pas.
Cependant, si je ferme la fenêtre du terminal, le script est tué.
Y a-t-il quelque chose que je peux faire (une combinaison de clavier), analogue à la fermeture de la fenêtre du terminal, sans fermer réellement la fenêtre du terminal (je ne veux pas perdre l'historique des commandes, le répertoire actuel, l'historique de sortie, etc.)?
Ctrl + z
Ctrl + z
course:kill -9 $(pgrep -f your_script.sh)
Réponses:
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é: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:Dans un autre terminal,
Dans ce cas, pour envoyer un signal au groupe de processus créé par
test.sh
, vous devez:-INT
est utilisé pour envoyerSIGINT
, et cette commande équivaut donc à appuyer CtrlCsur le terminal. Pour envoyerSIGKILL
:Vous ne devez arrêter le script que si vous ne pouvez pas ouvrir un autre terminal. Si vous le pouvez, utilisez
pgrep
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 essayerSIGTERM
(-TERM
) avant de vous lancer. NiSIGKILL
ouSIGTERM
peut être configuré comme un raccourci clavier commeSIGINT
est.Tout cela n'a plus sa raison d'être si votre script ne contient pas de ligne shebang. De cette réponse SO :
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.
la source
SIGKILL
ouSIGTERM
?pgrep test.sh
ne retourne pas le PID pour moi. J'ai essayé un test simple.sh:for i in {1..30}; do sleep 1 echo $i done
Pendanttest.sh
son exécution, je l'exécutepgrep test.sh
dans un autre terminal, mais rien n'est renvoyé. Qu'est-ce qui ne va pas?pgrep -f test.sh
.pgrep -f test.sh
ne fonctionne pas non plus. Je lance le script avec./test.sh
Si vous connaissez les processus associés au script, vous pouvez trouver leur PID en utilisant
puis utilisez le numéro PID pour tuer les processus correspondants à l'aide de
la source
Comme Harris l'a dit, vous pouvez exécuter,
Kill -9 PID_Number
mais vous pouvez également installer le packagehtop
doté d'un navigateur de processus interactif facilitant grandement la recherche de processus spécifiques. htop prend également en charge les processus de mise à mort.la source