Répéter la commande automatiquement sous Linux

303

Est-il possible dans la ligne de commande Linux d'avoir une répétition de commande toutes les n secondes?

Dis, j'ai une importation en cours et je fais

ls -l

pour vérifier si la taille du fichier augmente. Je voudrais avoir une commande pour que cette répétition se fasse automatiquement.

Marty Wallace
la source

Réponses:

541

Regardez toutes les 5 secondes ...

watch -n 5 ls -l

Si vous souhaitez avoir une confirmation visuelle des modifications, ajoutez-les --differencesavant la lscommande.

Selon la page de manuel OSX, il y a aussi

L'option --cumulative rend la surbrillance "collante", présentant un affichage en cours de toutes les positions qui ont changé. L'option -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 la ligne vierge suivante.

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

Rawkode
la source
4
Nice - dommage qu'il n'ajoute pas de résultats à la ligne de commande
Marty Wallace
1
Ajout d'une option pour répondre qui permet de mettre en évidence les changements
Rawkode
3
Notez que vous devez échapper les caractères spéciaux qui font partie de la commande que vous regardez, par exemple: watch mysql dbname -e \"show processlist\;\"
pfrenssen
11
brew install watch
Josh Unger
1
la montre n'est pas installée sur mac os X 10.10
João Nunes
118
while true; do
    sleep 5
    ls -l
done
Oleksandr Kravchuk
la source
10
watcha également le malheureux effet secondaire d'effacer l'écran, donc parfois la boucle est utile. Le choix dépend du format de sortie souhaité.
William Pursell
Je fais généralement la boucle, mais faites-le sur une seule ligne. La montre est beaucoup mieux, cependant, je vais devoir passer à cela.
Don Branson
1
@MartyWallace Cela peut être fait avec la ligne de commande (la boucle while).
keyser
Il convient de noter que vous pouvez les utiliser --differencespour les mettre en surbrillance (si vous êtes préoccupé par la repeinture du terminal)
Rawkode
C'est mieux que ça watch. Watch ne fonctionne pas par exemple lorsque vous souhaitez générer un nombre aléatoire dans chaque appel, par exemple watch -n 1 echo ${RANDOM}. Le hasard ne sera appelé qu'une seule fois.
Marcin
92

"watch" ne permet pas des fractions de seconde dans Busybox, tandis que "sleep" le permet. Si cela vous importe, essayez ceci:

while true; do ls -l; sleep .5; done
mikhail
la source
1
Ceci est utile si vous avez besoin de diriger la sortie quelque part (comme la barre non récursive)
Stephen Smith
1
Merci. Cela fonctionne pour les consoles busybox qui n'ont pas la commande watch. Je l'ai utilisé pour mesurer la disponibilité de mon système: tout en étant vrai; faire la disponibilité; dormir 1; fait
Santiago Villafuerte
FWIW sur l'ancienne version de busybox (v1.11.2) Je suis coincé avec, il n'y a pas de montre et le sommeil ne prend pas en charge les fractions. Mais vous pouvez utiliser Sleep 1 avec succès.
moodboom
C'est aussi un excellent moyen de gérer cela dans cygwin
Bradley
34

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

while sleep 3 ; do ls -l ; done

C'est un peu plus court que la solution de mikhail. Un inconvénient mineur est qu'il se met en veille avant d'exécuter la commande cible pour la première fois.

Sebastian Wagner
la source
18

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

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

jonathanzh
la source
J'avais du mal à faire fonctionner correctement la montre sur une expression sifflée, mais après avoir lu cela, je pouvais le réparer :)
dévoré elysium le
13

L'exécution périodique de commandes sans cron est possible lorsque nous allons avec while.

Comme une 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. Veuillez donc ajouter 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

Exécutez-le ensuite en tapant bash ./while_check.sh &

Ranjithkumar T
la source
N'est-ce pas le dernier &, comme écrire la commande sans & à la fin, mais appeler le script avec &: bash ./ while_check.sh &?
ransh
@ransh: Nous pouvons exécuter le script ./ While_check.sh & afin que nous puissions obtenir l'ID de processus immédiatement, lorsque nous ajoutons le script & in et exécutons simplement le script sans &, nous n'avons obtenu aucun ID de processus mais il s'exécutera fond, comme je l'ai édité, nous avons besoin de la commande ps pour obtenir l'identifiant du processus si nous devons arrêter le script.
Ranjithkumar T
Si vous le souhaitez, vous pouvez modifier le script echo $!après le lancement de chaque processus d'arrière-plan - c'est le PID du dernier processus enfant lancé en arrière-plan.
Jonathan Leffler
echo `date` est juste une façon pauvre et légèrement boguée d'écrire juste date. (Le bug a à voir avec le manque de citation de l'argument à echo.) Voir aussi l' utilisation inutile de echo.
tripleee
7

la montre est bonne mais nettoiera l'écran.

watch -n 1 'ps aux | grep php'
Eduardo
la source
6

Si vous voulez éviter la "dérive", ce qui signifie que vous voulez que la commande s'exécute toutes les N secondes quel que soit le temps que prend la commande (en supposant qu'elle prenne moins de N secondes), voici quelques bash qui répéteront une commande toutes les 5 secondes avec une- deuxième précision (et imprimera un avertissement s'il ne peut 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 car 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.

mcote
la source
Merci .. mais j'ai 2 questions, 1- où enregistrer ce code? en d'autres termes, dans quel chemin dois-je placer le fichier contenant ce script? qui le fait fonctionner automatiquement?! 2- Comment inclure le fichier php dans (commande # do) au lieu d'y taper tout mon code?
Hossam
1
Je vous suggère de rechercher un peu sur les scripts bash afin que vous puissiez comprendre les bases de leur exécution, etc.
mcote
4

Si vous voulez faire quelque chose un certain nombre de fois, vous pouvez toujours le faire:

repeat 300 do my first command here && sleep 1.5
boule lumineuse
la source
8
pour les for x in {1..300} ; do commandes bash do||break;sleep 1.5; done
Jasen
4

Vous pouvez exécuter ce qui suit et filtrer la taille uniquement. Si votre fichier a été appelé, somefilenamevous pouvez procéder comme suit

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

L'une des nombreuses idées.

Valentin Bajrami
la source
2

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 pour exécuter la structure de la boucle et la commande sleep pour s'exécuter réellement.

indice: ':' vaut 0, c'est-à-dire vrai.

math
la source
1
watch -n 5 'ls -l 

Exécute la ls -lcommande toutes les 5 secondes

Production :-

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
HeadAndTail
la source
1

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

while ls -l; do
    sleep 5
done
arsdragonfly
la source