73 votes

Ré-exécution continue d'une commande lorsqu'elle se termine en Bash

J'essaie de trouver un moyen simple de réexécuter une commande chaque fois qu'elle se termine, pour quelque raison que ce soit (erreur ou autre).

Quelle serait la meilleure façon d'aborder cette question ?

EDITAR: Je n'ai pas été assez clair avant. J'ai besoin de la prochaine exécution pour attendre jusqu'à ce que le précédent se termine.

EDIT 2 : Presque toutes les réponses fonctionnent très bien. I

115voto

Oliver Points 125

El watch La commande répétera une commande pour toujours avec un intervalle spécifié :

watch -n0 <command>

Réglage de -n à zéro met effectivement l'intervalle à rien (je pense que c'est vraiment .1 secondes).

watch a également l'avantage d'aligner la sortie de manière à ce que les changements visuels soient facilement visibles, et dispose d'un commutateur pour mettre en évidence les changements par rapport à la dernière exécution.

Référence : la page de manuel watch :

watch exécute la commande de manière répétée, en affichant sa sortie (le premier écran complet). Cela vous permet de voir la sortie du programme changer au fil du temps. Par défaut, le programme est exécuté toutes les 2 secondes ; utilisez -n ou --interval pour spécifier un intervalle différent.

La montre fonctionnera jusqu'à ce qu'elle soit interrompue.

46voto

Dennis Points 46916

Cela crée une boucle infinie, exécutant command encore et encore.

while :
do
    command
done

19voto

Une solution simple serait :

yourcommand; !#

; sépare les commandes, ce qui permet de regrouper plusieurs commandes sur une seule ligne ( Bash : Listes )

!# dit à bash de "répéter tout ce que j'ai écrit jusqu'à présent dans cette ligne" ( Bash : Concepteurs d'événements )

7voto

Daniel Beck Points 105590

Vous pouvez anticiper l'exécution d'une commande (à condition qu'elle ne soit pas interactive) et saisir !! qui exécutera à nouveau la commande précédente. Cela fonctionne, par exemple, pendant ping -c 5 .


Vous pouvez également définir une fonction dans bash :

function repeat { "$@"; "$@"; }

Pour le faire persister, il faut le stocker dans ~/.bashrc .

Ensuite, vous pouvez exécuter votre commande comme ceci :

repeat ping -c5 heise.de

Si c'est une commande spécifique que vous voulez exécuter de manière répétée (et non pas par exemple cualquier ), vous pouvez remplacer "$@" dans ce snippet avec votre commande réelle, et nommez la fonction par ex. repeat_ping à la place.


Pour en faire une boucle infinie, vous pouvez faire ce que @Dennis suggère. Je vous recommande d'ajouter une période d'attente si vous avez l'intention d'utiliser ceci dans un Shell interactif, comme ceci :

function repeat { while 1 ; do "$@" ; sleep 1 ; done; }

Sinon, il est plutôt malcommode d'interrompre cette boucle infinie en utilisant Ctrl-Z .

5voto

Donnez un while boucle une condition booléenne telle que la suivante :

#!/bin/bash

while true; do

    do_something && wait

done

Ceci s'exécutera encore et encore jusqu'à ce que bash reçoive un signal pour terminer le processus. Habituellement sous la forme de ctrl+c .

Vous pouvez également utiliser le watch pour exécuter un script de manière répétée également. Par exemple une simple horloge dans votre terminal bash utilisant watch pourrait ressembler :

$ watch -t -n1 date +%T

El -t L'option indique watch pour ne pas afficher un titre du processus qu'il exécute. Cela vous donne une sortie propre de la seule commande qui est répétée. Le site -n1 L'option indique à la montre de répéter chaque n secondes. Dans ce cas, -n1 seront des intervalles de 1 deuxième. Ensuite, le date +%T affiche l'heure au moment de la fin de la commande. En exécutant cette commande, vous disposerez d'une horloge active dans votre terminal.

Et une autre méthode qui ne figure dans aucune des autres réponses serait un appel de fonction infini.

do_something() { do_something }; do_something && wait

C'est essentiellement la même chose que le booléen while boucle uniquement en utilisant des appels de fonction récursifs.

(edit) Pour garder à l'esprit les ressources de votre machine, j'ai ajouté la fonction && wait de sorte que chaque fois qu'un processus est exécuté, les boucles "attendent" que ce processus se termine avec le statut de sortie 0 avant l'itération suivante. Ceci est utile dans un Shell Shell interactif.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X