web-dev-qa-db-fra.com

Comment arrêter le script bash de boucle dans le terminal?

Par exemple,

#!/bin/bash
while :
do
    sl
done

Comment terminer ce script bash?

58
Yinyanghu

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
72
Jim Paris
  1. presse Ctrl-Z pour suspendre le script
  2. kill %%

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)

128
cas

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.

7
Dale Anderson

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- \

4
RobertL

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.

4
panaroik

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).

1
Suwarto

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
0
chanze