315 votes

Répéter une commande automatiquement sous Linux

Est-il possible dans la ligne de commande de Linux d'avoir une commande qui répète tous les n secondes ?

Disons que j'ai une importation en cours et que je fais

ls -l

pour vérifier si la taille du fichier augmente. J'aimerais disposer d'une commande pour que cette opération se répète automatiquement.

560voto

Rawkode Points 8616

Regardez toutes les 5 secondes ...

watch -n 5 ls -l

Si vous souhaitez avoir une confirmation visuelle des changements, ajoutez --differences avant l'entrée en vigueur de la ls commandement.

Selon la page de manuel d'OSX, il y a aussi

L'option --cumulative rend la mise en évidence "collante", en présentant un de toutes les positions qui ont été modifiées. Les options -t ou --no-title désactive l'en-tête affichant l'intervalle, la commande, et l'heure actuelle en haut de l'écran, ainsi que l'option ligne blanche suivante.

La page de manuel Linux/Unix peut être consultée aquí

4 votes

Bien - dommage qu'il n'ajoute pas les résultats à la ligne de commande.

1 votes

Ajout d'une option à la réponse qui permet de mettre en évidence les changements

3 votes

Notez que vous devez échapper aux caractères spéciaux qui font partie de la commande que vous observez, par exemple : watch mysql dbname -e \"show processlist\;\"

123voto

Oleksandr Kravchuk Points 2044
while true; do
    sleep 5
    ls -l
done

11 votes

watch a aussi le fâcheux effet secondaire d'effacer l'écran, donc parfois la boucle est utile. Le choix dépend du format de sortie souhaité.

0 votes

Je fais généralement la boucle, mais sur une seule ligne. Watch a l'air beaucoup mieux, cependant, je vais devoir passer à cela.

1 votes

@MartyWallace Cela peut être fait avec la ligne de commande (la boucle while).

95voto

mikhail Points 623

La fonction "watch" n'autorise pas les fractions de seconde dans Busybox, alors que la fonction "sleep" le permet. Si cela vous importe, essayez ceci :

while true; do ls -l; sleep .5; done

1 votes

Ceci est utile si vous avez besoin de diriger la sortie quelque part (comme bar aint recursive)

1 votes

Merci. Cela fonctionne pour les consoles busybox qui n'ont pas la commande watch. Je l'ai utilisé pour mesurer le temps de fonctionnement de mon système : while true ; do uptime ; sleep 1 ; done

0 votes

FWIW sur l'ancienne version de busybox (v1.11.2) avec laquelle je suis coincé, il n'y a pas de montre, et le sommeil ne supporte pas les fractions. Mais on peut utiliser sleep 1 avec succès.

6voto

mcote Points 21

Si vous voulez éviter la "dérive", c'est-à-dire que vous voulez que la commande soit exécutée toutes les N secondes, quelle que soit la durée de la commande (en supposant qu'elle prenne moins de N secondes), voici un peu de bash qui répétera une commande toutes les 5 secondes avec une précision d'une seconde (et affichera un avertissement s'il n'arrive pas à suivre) :

PERIOD=5

while [ 1 ]
do
    let lastup=`date +%s`
    # do command
    let diff=`date +%s`-$lastup
    if [ "$diff" -lt "$PERIOD" ]
    then
        sleep $(($PERIOD-$diff))
    elif [ "$diff" -gt "$PERIOD" ]
    then
        echo "Command took longer than iteration period of $PERIOD seconds!"
    fi
done

Elle peut encore dériver un peu, car le sommeil n'est précis qu'à une seconde près. Vous pouvez améliorer cette précision en utilisant de manière créative la commande date.

0 votes

Merci mais j'ai 2 questions, 1- où sauvegarder ce code ? en d'autres termes, dans quel chemin dois-je mettre le fichier contenant ce script ? pour qu'il s'exécute automatiquement ?! 2- comment inclure le fichier php dans la commande ( # do ) au lieu de taper tout mon code à cet endroit ?

1 votes

Je vous suggère de faire quelques recherches sur les scripts bash afin de comprendre les bases de leur exécution et ainsi de suite.

4voto

val0x00ff Points 159

Vous pouvez exécuter la procédure suivante et filtrer uniquement la taille. Si votre fichier s'appelle somefilename vous pouvez faire ce qui suit

while :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done

Une des nombreuses idées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X