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.
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
while true; do
sleep 5
ls -l
done
"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
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.
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"'
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 &
la montre est bonne mais va nettoyer l'écran.
watch -n 1 'ps aux | grep php'
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.
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.
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
watch -n 5 'ls -l
Est-ce que Runls -l
commande tous les 5 s
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
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.
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