web-dev-qa-db-fra.com

Répéter la commande automatiquement sous Linux

Est-il possible en ligne de commande Linux de faire répéter une commande toutes les n secondes?.

Par exemple, disons que j'ai une importation en cours et que je le fais

ls -l

pour vérifier la taille du fichier augmente. Je voudrais avoir une commande pour que cela se répète automatiquement.

291
Marty Wallace

Regarder toutes les 5 secondes ...

watch -n 5 ls -l

Si vous souhaitez avoir une confirmation visuelle des modifications, ajoutez --differences avant la commande ls.

Selon la page de manuel OSX, il y a aussi

L'option --cumulative rend la mise en surbrillance "collante", présentant un affichage continu de toutes les positions jamais modifiées. L'option -t ou --no-title désactive l'en-tête indiquant l'intervalle, la commande et l'heure actuelle en haut de l'écran, ainsi que la ligne vierge suivante.

La page de manuel Linux/Unix peut être trouvée ici

524
Rawkode
while true; do
    sleep 5
    ls -l
done
111
Oleksandr Kravchuk

"watch" n'autorise pas les fractions de seconde dans Busybox, contrairement à "sleep". Si cela vous concerne, essayez ceci:

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

sleep renvoie déjà 0. En tant que tel, j'utilise:

while sleep 3 ; do ls -l ; done

C'est un tout petit peu plus court que la solution de Mikhail. Un inconvénient mineur est qu'il dort avant d'exécuter la commande cible pour la première fois.

31
Sebastian Wagner

Si la commande contient des caractères spéciaux tels que des tubes et des guillemets, elle doit être complétée par des guillemets. Par exemple, pour répéter ls -l | grep "txt", la commande de surveillance doit être:

watch -n 5 'ls -l | grep "txt"'

18
jonathanzh

Exécuter des commandes périodiquement sans cron est possible quand on utilise while.

En tant que commande:

while true ; do command ; sleep 100 ; done &
[ ex: # while true;  do echo `date` ; sleep 2 ; done & ]

Exemple:

while true
do echo "Hello World"
sleep 100
done &

N'oubliez pas le dernier & car il mettra votre boucle en arrière-plan. Mais vous devez trouver l'ID de processus avec la commande "ps -ef | grep your_script", puis vous devez le tuer. Ajoutez donc le '&' lorsque vous exécutez le script.

# ./while_check.sh &

Voici la même boucle qu'un script. Créez le fichier "while_check.sh" et mettez-le dedans:

#!/bin/bash
while true; do 
    echo "Hello World" # Substitute this line for whatever command you want.
    sleep 100
done

Puis lancez-le en tapant bash ./while_check.sh &

13
Ranjithkumar T

la montre est bonne mais va nettoyer l'écran.

watch -n 1 'ps aux | grep php'
7
Eduardo

Si vous voulez éviter "la dérive", c'est-à-dire que vous voulez que la commande s'exécute toutes les N secondes, quelle que soit la durée de la commande (en supposant que cela prenne moins de N secondes), voici une bash qui répète une commande toutes les 5 secondes avec une minute. deuxième précision (et affichera un avertissement s’il ne parvient 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

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

6
mcote

Vous pouvez exécuter ce qui suit et filtrer la taille uniquement. Si votre fichier s’appelait somefilename, vous pouvez procéder comme suit:

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

Une des nombreuses idées.

4
Valentin Bajrami

Si vous voulez faire quelque chose un nombre de fois spécifique, vous pouvez toujours le faire:

repeat 300 do my first command here && sleep 1.5
4
brightball
watch -n 5 'ls -l 

Est-ce que Runls -l commande tous les 5 s

Sortie: -

Every 5.0s: ls -l                                                                                                      Fri Nov 17 16:28:25 2017

total 169548
-rw-rw-r--  1 sachin sachin     4292 Oct 18 12:16 About_us_Admission.doc
-rw-rw-r--  1 sachin sachin      865 Oct 13 15:26 About_us_At_glance.doc
-rw-rw-r--  1 sachin sachin     1816 Oct 13 16:11 About_us_Principle.doc
-rw-rw-r--  1 sachin sachin     1775 Oct 13 15:59 About_us_Vission_mission.doc
-rw-rw-r--  1 sachin sachin     1970 Oct 13 16:41 Academic_Middle_school.doc
-rw-rw-r--  1 sachin sachin      772 Oct 16 16:07 academics_High_School.doc
-rw-rw-r--  1 sachin sachin      648 Oct 16 13:34 academics_pre_primary.doc
-rw-rw-r--  1 sachin sachin      708 Oct 16 13:39 academics_primary.doc
-rwxrwxr-x  1 sachin sachin     8816 Nov  1 12:10 a.out
-rw-rw-r--  1 sachin sachin    23956 Oct 23 18:14 Ass1.c++
-rw-rw-r--  1 sachin sachin      342 Oct 23 22:13 Ass2.doc
drwxrwxr-x  2 sachin sachin     4096 Oct 19 10:45 Backtracking
drwxrwxr-x  3 sachin sachin     4096 Sep 23 20:09 BeautifulSoup
drwxrwxr-x  2 sachin sachin     4096 Nov  2 00:18 CL_1
drwxrwxr-x  2 sachin sachin     4096 Oct 23 20:16 Code
drwxr-xr-x  2 sachin sachin     4096 Nov 15 12:05 Desktop
-rw-rw-r--  1 sachin sachin        0 Oct 13 23:12 doc
drwxr-xr-x  4 sachin sachin     4096 Nov  6 21:18 Documents
drwxr-xr-x 27 sachin sachin    12288 Nov 17 13:23 Downloads
-rw-r--r--  1 sachin sachin     8980 Sep 19 23:58 examples.desktop
1
HeadAndTail

Pour minimiser plus facilement la dérive, utilisez:

while :; do sleep 1m & some-command; wait; done

il y aura toujours une petite quantité de dérive due au temps de bash d'exécuter la structure de boucle et la commande de veille à exécuter réellement.

indice: ':' évalue à 0 c'est-à-dire vrai.

1
math

Une solution concise, particulièrement utile si vous souhaitez exécuter la commande plusieurs fois jusqu'à ce qu'elle échoue, et vous permet de voir toutes les sorties.

while ls -l; do
    sleep 5
done
0
arsdragonfly