J'ai une commande que je veux relancer automatiquement chaque fois qu'elle se termine, alors j'ai lancé quelque chose comme ceci:
while [ 1 ]; do COMMAND; done;
mais si je ne peux pas arrêter la boucle avec Ctrl-cça, ça tue COMMAND
et pas la boucle entière.
Comment pourrais-je obtenir quelque chose de similaire mais que je peux arrêter sans avoir à fermer le terminal?
Réponses:
Vérifiez le statut de sortie de la commande. Si la commande s'est terminée par un signal, le code de sortie sera 128 + le numéro du signal. De la documentation en ligne GNU pour bash :
POSIX spécifie également que la valeur d'une commande terminée par un signal est supérieure à 128, mais ne semble pas spécifier sa valeur exacte comme le fait GNU:
Par exemple, si vous interrompez une commande avec control-C, le code de sortie sera 130, car SIGINT est le signal 2 sur les systèmes Unix. Alors:
la source
paplay alert.ogg
, peut-être parce quepaplay
gère le signal?Vous pouvez arrêter et mettre votre travail en arrière-plan pendant son exécution à l'aide de ctrl+ z. Ensuite, vous pouvez tuer votre travail avec:
Où [1] est votre numéro de travail.
la source
Je dirais qu'il serait peut-être préférable de mettre votre boucle infinie dans un script et de gérer les signaux là-bas. Voici un point de départ de base . Je suis sûr que vous voudrez le modifier pour l'adapter. Le script utilise
trap
pour attraper ctrl- c(ouSIGTERM
), élimine la commande (je l’ai utilisésleep
ici comme test) et quitte.la source
trap "exit 0" SIGINT SIGTERM; while true; do netcat -l -p 3000; done
trap
approche au même script (bash) avec la boucle infinie à tuer, utilisez-la à la$$
place de$!
(voir ici )En général, je tiens juste Ctrl-C. Tôt ou tard, il s'enregistrera entre
COMMAND
et sonnera ainsi lawhile
boucle. Peut-être y a-t-il un meilleur moyen.la source
paplay
sur un fichier 1s.Si vous exécutez bash avec
-e
il se terminera en cas d'erreur:la source
Pourquoi pas simplement,
Ou lorsqu'il est utilisé dans un script,
la source
Je préfère une autre solution:
Afin de tuer la boucle, il suffit de faire:
la source
while :
créera une boucle infinie et vous évitera d’écrire le[ 1 ]
Ceci imprimera le PID. Si vous quittez votre invite à l'aide
ctrl+d
du travail en arrière-plan, il ne sera pas arrêté et vous pourrez ensuite le supprimer de n'importe où en utilisantkill PID
Si vous perdez la trace de votre PID, vous pouvez utiliser
pstree -pa $USER
oupgrep -fl '.*PROCESS.*'
pour vous aider à le trouver.la source
Utiliser
trap
-la source