Réponses:
Vous pouvez utiliser watchcommande, 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 watchcommande et de ses options, exécutez man watchou 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
watchavec 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’ watchutilitaire 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 ls2 secondes.
Utilisez Ctrl+ Cpour arrêter le processus.
Il y a peu d'inconvénients de watch
watchinterprétera les séquences de couleurs ANSI en transmettant les caractères d'échappement à l'aide de l' option -cou --color. Par exemple, la sortie de pygmentizetravaillera mais échouera pour ls --color=auto.Dans les circonstances ci-dessus, cela peut sembler une meilleure option.
watchexiste pour cela, c'est un peu inutile je dirais
watchest 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 watchpar exemple On ne peut utiliser aucune commande avec aliaswatch . Prenons l'exemple de l' llalias qui ls -laFne 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.
watchau moins autorise les options -cou --colorpour une sortie colorisée.
while sleep xc'est mieux - c'est plus facile à tuer.
watchcela, elle conserve l'historique des commandes.
Je voulais juste apporter ma réponse aux réponses de souravc et nux :
watchcela 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; donea 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 SECONDSavant que la première occurrence de la commande se produise.sleepdans la whileboucle? Je ne trouvais aucune différence, Ctrl + C rompait instantanément la boucle, peu importe quoi.
commandet sleepet ne casserait que si vous le tuiez true.
Cela semble être la tâche idéale du crondémon, qui permet d’exécuter des commandes périodiques. Exécutez la crontab -ecommande 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"
cronse passe dans les coulisses plutôt que dans le terminal
Si vous surveillez le système de fichiers, il inotifywaitest 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|lesss'agit-il d'un script?
.je ne peux pas laisser de côté la commande.
-mpour surveiller en continu sans boucle.
Vous pouvez créer votre propre repeatcommande en procédant comme suit: crédits ici :
Commencez par ouvrir votre .bash_aliasesfichier:
$ 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 -eet 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 $COLUMNSlors du redimensionnement de votre terminal: le premier est développé toutes les secondes, mais le dernier n’est développé qu’une fois avant lewatchdébut.