Par exemple,
#!/bin/bash
while :
do
sl
done
Comment terminer ce script bash?
Le programme sl
ignore délibérément SIGINT
, ce qui est envoyé lorsque vous appuyez sur Ctrl+C. Donc, tout d'abord, vous devrez dire à sl
de ne pas ignorer SIGINT
en ajoutant le -e
argument.
Si vous essayez ceci, vous remarquerez que vous pouvez arrêter chaque sl
individuel, mais ils se répètent toujours. Vous devez également dire à bash
de quitter après SIGINT
. Vous pouvez le faire en mettant un trap "exit" INT
avant la boucle.
#!/bin/bash
trap "exit" INT
while :
do
sl -e
done
Ctrl-Z
pour suspendre le scriptkill %%
Le %%
indique au bash intégré kill
que vous souhaitez envoyer un signal (SIGTERM par défaut) au dernier travail d'arrière-plan suspendu dans le shell actuel, et non à un identifiant de processus.
Vous pouvez également spécifier des travaux par numéro ou par nom. par exemple. lorsque vous suspendez un travail avec ^ Z, bash vous indiquera son numéro de travail avec quelque chose comme [n]+ Stopped
, où le n
entre crochets est le numéro du travail.
Pour plus d'informations sur le contrôle des travaux et sur la suppression des travaux, exécutez help jobs
, help fg
, help bg
, et help kill
en bash et recherchez JOB CONTROL
(toutes majuscules) ou jobspec
dans la page de manuel bash.
par exemple.
$ ./killme.sh ./ killme.sh: ligne 4: sl: commande introuvable ./ killme.sh: ligne 4: sl: commande introuvable ./ killme.sh: ligne 4: sl: commande introuvable ./ killme.sh: ligne 4: sl: commande introuvable ./ killme.sh: ligne 4 : sl: commande introuvable ... ... ... ./ killme.sh: ligne 4: sl: commande introuvable ^ Z [1] + Arrêté ./killme.sh. sh
Dans cet exemple, le numéro du travail était 1, donc kill %1
aurait fonctionné comme kill %%
(NOTE: je n'ai pas sl
installé donc la sortie est juste "commande introuvable". Dans votre cas, vous obtiendrez tout ce que sl produit. Ce n'est pas important - le ^Z
suspendre et kill %%
fonctionnera de la même façon)
Si vous voulez que ctrl + c arrête la boucle, mais ne termine pas le script, vous pouvez placer || break
après la commande que vous exécutez. Tant que le programme que vous exécutez se termine sur ctrl + c, cela fonctionne très bien.
#!/bin/bash
while :
do
# ctrl+c terminates sl, but not the Shell script
sl -e || break
done
Si vous êtes en boucle imbriquée, vous pouvez utiliser "break 2" pour sortir de deux niveaux, etc.
Le moyen le plus simple consiste à émettre le signal QUIT
, qui est généralement attaché à Control-Backslash
.
Lorsque vous voyez le train, appuyez sur Control- \
Vous pouvez terminer ce script en appuyant sur Ctrl + C à partir du terminal où vous avez commencé ce script. Bien sûr, ce script doit s'exécuter au premier plan afin que vous puissiez l'arrêter en appuyant sur Ctrl + C.
Ou vous pouvez trouver le PID (Process ID) de ce script dans un autre terminal ouvert en:
ps -ef | grep <name_of_the_script>
kill -9 <pid_of_your_running_script>
Les deux façons devraient faire l'affaire que vous demandez.
Vous pouvez kill
le pid
de Shell (bash).
Je viens d'essayer et ça marche.
Parce que je ne peux pas voir le processus de ps -ef
(le travail que nous exécutons dans le script de bouclage).
Une autre façon de terminer le script entier serait de mettre en arrière-plan la commande sl
puis d'intercepter le signal INT
pour tuer tout le groupe de processus du script avec le signal HUP
.
#!/bin/bash
trap 'trap - INT; kill -s HUP -- -$$' INT
#trap 'trap - INT; kill -s HUP 0' INT
while :
do
sl & wait
done