Réponses:
Vous pouvez utiliser watch
commande, watch est utilisé pour exécuter toute commande désignée à intervalles réguliers.
Ouvrez le terminal et tapez:
watch -n x <your command>
changez x pour être le temps en secondes que vous voulez.
Pour obtenir de l'aide supplémentaire sur l'utilisation de la watch
commande et de ses options, exécutez man watch
ou visitez ce lien .
Par exemple: ce qui suit va lister, toutes les 60 secondes , sur le même terminal, le contenu du répertoire Desktop afin que vous puissiez savoir si des modifications ont eu lieu:
watch -n 60 ls -l ~/Desktop
watch
avec une commande de type "historique activé"? J'aime utiliser watch
, mais parfois je préférerais voir un journal des exécutions précédentes aussi bien que juste la dernière. Et oui, je sais que je peux utiliser un script ( while true
) pour accomplir cela, mais l’ watch
utilitaire est beaucoup plus propre!
Vous pouvez également utiliser cette commande dans terminal, en dehors de la réponse de nux:
while true; do <your_command>; sleep <interval_in_seconds>; done
Exemple
while true; do ls; sleep 2; done
Cette commande affichera la sortie tous les ls
2 secondes.
Utilisez Ctrl+ Cpour arrêter le processus.
Il y a peu d'inconvénients de watch
watch
interprétera les séquences de couleurs ANSI en transmettant les caractères d'échappement à l'aide de l' option -c
ou --color
. Par exemple, la sortie de pygmentize
travaillera mais échouera pour ls --color=auto
.Dans les circonstances ci-dessus, cela peut sembler une meilleure option.
watch
existe pour cela, c'est un peu inutile je dirais
watch
est bon dans la plupart des cas. C'est pourquoi j'ai mentionné "en dehors de la réponse de Nux" au début. Mais il y a peu de problèmes avec watch
par exemple On ne peut utiliser aucune commande avec aliaswatch
. Prenons l'exemple de l' ll
alias qui ls -laF
ne peut être utilisé avec watch
. De même, si le résultat d’une commande est assez long, vous aurez du mal à faire défiler avec watch
. Dans ces quelques cas particuliers, cette réponse peut sembler une meilleure option.
watch
au moins autorise les options -c
ou --color
pour une sortie colorisée.
while sleep x
c'est mieux - c'est plus facile à tuer.
watch
cela, elle conserve l'historique des commandes.
Je voulais juste apporter ma réponse aux réponses de souravc et nux :
watch
cela fonctionne parfaitement sur Ubuntu, vous voudrez peut-être éviter cela si vous voulez que votre "Unix-fu" soit pur - sur FreeBSD par exemple, watch est une commande pour "espionner sur une autre ligne de tty".while true; do command; sleep SECONDS; done
a aussi une mise en garde - votre commande pourrait être plus difficile à tuer en utilisant CTR + C . Vous voudrez peut-être préférer while sleep SECONDS; do command; done
- c'est non seulement plus court, mais aussi plus facile à interrompre. La mise en garde est qu'il va d'abord dormir, puis exécuter votre commande, vous devrez donc attendre SECONDS
avant que la première occurrence de la commande se produise.sleep
dans la while
boucle? Je ne trouvais aucune différence, Ctrl + C rompait instantanément la boucle, peu importe quoi.
command
et sleep
et ne casserait que si vous le tuiez true
.
Cela semble être la tâche idéale du cron
démon, qui permet d’exécuter des commandes périodiques. Exécutez la crontab -e
commande pour commencer à modifier la configuration cron de votre utilisateur. Son format est documenté dans crontab (5) . En gros, vous avez cinq champs liés au temps, séparés par des espaces, suivis d'une commande:
The time and date fields are:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sunday, or use names)
Par exemple, si vous souhaitez exécuter un script Python tous les mardis, 11 heures:
0 11 * * 1 python ~/yourscript.py
Il y a aussi des noms spéciaux qui remplacent l'heure, comme @reboot
. Très utile si vous devez créer un répertoire temporaire. De ma crontab (listée avec crontab -l
):
# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"
cron
se passe dans les coulisses plutôt que dans le terminal
Si vous surveillez le système de fichiers, il inotifywait
est brillant et ajoute certainement moins de charge sur votre système.
Exemple :
Au 1er terminal tapez cette commande:
$ inotifywait .
Ensuite, dans 2nd terminal, toute commande qui affecte le répertoire en cours,
$ touch newfile
Puis inotifywait dans le terminal d'origine se réveille et rapporte l'événement
./ CREATE newfile2
Ou en boucle
$ while true ; do inotifywait . ; done
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ OPEN newfile2
Setting up watches.
Watches established.
./ DELETE newfile
Setting up watches.
Watches established.
./ CREATE,ISDIR newdir
Setting up watches.
Watches established.
grep something InALogFile|less
s'agit-il d'un script?
.
je ne peux pas laisser de côté la commande.
-m
pour surveiller en continu sans boucle.
Vous pouvez créer votre propre repeat
commande en procédant comme suit: crédits ici :
Commencez par ouvrir votre .bash_aliases
fichier:
$ xdg-open ~/.bash-aliases
Deuxièmement, collez ces lignes au bas du fichier et enregistrez:
repeat() {
n=$1
shift
while [ $(( n -= 1 )) -ge 0 ]
do
"$@"
done
}
Troisièmement, fermez et rouvrez votre terminal ou tapez:
$ source ~/.bash_aliases
Et voilà ! Vous pouvez maintenant l'utiliser comme ceci:
$ repeat 5 echo Hello World !!!
ou
$ repeat 5 ./myscript.sh
vous pouvez utiliser crontab. lancez la commande crontab -e
et ouvrez-la avec votre éditeur de texte préféré, puis ajoutez cette ligne
*/10 * * * * /path-to-your-command
Cela lancera votre commande toutes les 10 minutes
* */4 * * * /path-to-your-command
Cela exécutera votre commande toutes les 4 heures
$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done
X nombre de fois à répéter.
Y le temps d'attendre pour répéter.
Exemple :
$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done
L’approche «veille» proposée ci-dessus pose un autre problème: elle n’affiche le résultat que lorsque le processus est terminé. "date; sommeil 58; date" affichera les 2 dates seulement après 59 secondes ... Si vous démarrez quelque chose pendant 4 minutes, si vous affichez lentement plusieurs pages de contenu, vous ne le verrez pas vraiment.
D'autre part, le problème avec l'approche "tant que" est qu'elle ne prend pas en compte la durée de la tâche.
while true; do script_that_take_between_10s_to_50s.sh; sleep 50; done
Avec cela, le script s'exécutera toutes les minutes, parfois 1m40. Donc même si un cron sera capable de le lancer toutes les minutes, ici, il ne le fera pas.
Donc, pour voir la sortie sur le shell telle qu'elle est générée et attendre l'heure exacte de la requête, vous devez regarder l'heure avant et après et boucler avec.
Quelque chose comme:
while ( true ); do
echo Date starting `date`
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))`
echo Before waiting `date`
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
echo Done waiting `date`
done
Cela produira ceci:
Comme vous pouvez le constater, la commande s’exécute toutes les minutes:
Date starting Mon Dec 14 15:49:34 EST 2015
Before waiting Mon Dec 14 15:49:52 EST 2015
Done waiting Mon Dec 14 15:50:34 EST 2015
Date starting Mon Dec 14 15:50:34 EST 2015
Before waiting Mon Dec 14 15:50:39 EST 2015
Done waiting Mon Dec 14 15:51:34 EST 2015
Il suffit donc de remplacer la echo $(( ( RANDOM % 30 ) + 1 ))
commande "sleep " par ce que vous voulez et qui sera exécutée, sur le terminal / shell, exactement chaque minute. Si vous voulez un autre horaire, il suffit de changer les "60" secondes avec tout ce dont vous avez besoin.
Version plus courte sans les lignes de débogage:
while ( true ); do
before=`date +%s`
sleep `echo $(( ( RANDOM % 30 ) + 1 ))` # Place you command here
after=`date +%s`
DELAY=`echo "60-($after-$before)" | bc`
sleep $DELAY
done
watch -n 1 'echo $COLUMNS'
etwatch -n 1 echo $COLUMNS
lors du redimensionnement de votre terminal: le premier est développé toutes les secondes, mais le dernier n’est développé qu’une fois avant lewatch
début.