Question Répéter une commande tous les x intervalles de temps dans le terminal?


Comment puis-je répéter une commande à chaque intervalle de temps, de sorte que cela me permette d'exécuter des commandes pour vérification  ou surveillance  des répertoires?

Il n'y a pas besoin de script, j'ai juste besoin d'une simple commande à exécuter dans le terminal.


123
2018-03-06 15:52


origine




Réponses:


Vous pouvez utiliser watch commander, regarder est utilisé pour exécuter toute commande désignée à intervalles réguliers.

Terminal ouvert et tapez:

watch -n x <your command>

changement X être le temps en secondes que vous voulez.

Pour plus d'aide en utilisant le watch commande et ses options, exécutez man watch ou visitez ce Lien.

Par exemple : la liste suivante liste tous les Années 60, sur le même terminal, le contenu du répertoire Desktop afin de savoir si des modifications ont été apportées:

watch -n 60 ls -l ~/Desktop

189
2018-03-06 15:54



+1 mais soyez prudent lorsque vous utilisez des extensions. Par exemple, essayez la différence entre watch -n 1 'echo $COLUMNS' et watch -n 1 echo $COLUMNS lors du redimensionnement de votre terminal - le premier est développé toutes les secondes, mais le dernier est développé une seule fois avant  watch départs. - l0b0
les électeurs en bas devraient au moins laisser une commande pour éditer ma réponse, si je me trompe - nux
Je sais que je suis un pédant et une grammaire nazie, mais le langage utilisé par SE me rend fou. - Agi Hammerthief
+1 pour répondre à la question même si votre anglais n'est pas parfait à 100%. - dotancohen
Y a-t-il un moyen d'utiliser watch avec la commande de type "historique activée"? J'aime utiliser watch, mais parfois je préfère voir un journal des exécutions précédentes, plutôt que le dernier. Et oui, je sais que je peux utiliser des scripts (while true) pour accomplir cela, mais en utilisant le watch utilitiy est tellement plus propre! - rinogo


Vous pouvez également utiliser cette commande dans le terminal, à part 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 imprime la sortie de ls à un intervalle de 2 sec.

Utilisation Ctrl+C pour arrêter le processus.

Il y a peu d'inconvénients de watch

  • Il ne peut utiliser aucune commande aliasée.
  • Si la sortie d'une commande est assez longue, le défilement ne fonctionne pas correctement.
  • Il y a des problèmes à régler intervalle de temps maximum au-delà de certaines valeurs.
  • watch interprétera les séquences de couleurs ANSI en passant des caractères d'échappement en utilisant -c ou --color option. Par exemple sortie de pygmentize travaillera mais il échouera pour ls --color=auto.

Dans les circonstances ci-dessus, cela peut apparaître comme une meilleure option.


75
2018-03-06 16:00



watch existe pour cela, c'est un peu inutile je dirais - Bruno Pereira
Je ne prétends pas que cette réponse doit être utilisée en premier lieu. 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 un ne peut utiliser aucune commande alias avec watch. Prends pour exemple ll qui alias à ls -laF mais ne peut pas être utilisé avec watch. De même, si la sortie d’une commande est assez longue, vous aurez du mal à faire défiler en utilisant watch. Dans ces quelques cas particuliers, cette réponse peut apparaître comme une meilleure option. - souravc
@souravc Ma version de watch au moins permet la -c ou --color options pour la sortie colorisée. - ikdc
while sleep x c'est mieux - c'est plus facile à tuer. - d33tah
Ceci est une belle alternative et, contrairement à watch, il conserve l'historique des commandes. - adelriosantiago


Je voulais juste parler pour souravc et nuxles réponses:

  1. Tandis que watch fonctionnera parfaitement sur Ubuntu, vous voudrez peut-être éviter que si vous voulez que votre "Unix-fu" soit pur - sur FreeBSD par exemple, watch est une commande pour "espionner une autre ligne tty".
  2. while true; do command; sleep SECONDS; done a également 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 - Ce n'est pas seulement plus court, mais aussi plus facile à interrompre. La mise en garde est qu'il va d'abord dormir, puis exécutez votre commande, vous devrez donc attendre quelques SECONDS avant la première occurrence de la commande se produira.

31
2018-03-08 15:51



J'espère que c'est acceptable comme réponse plutôt que comme commentaire - je voulais montrer une autre solution ici et commenter me donnerait moins d'attention. - d33tah
Pourquoi est-ce que c'est important où vous mettez sleep dans le while boucle? Je n'ai pas trouvé de différence, Ctrl + C a brisé la boucle immédiatement peu importe ce que. - dessert
@dessert: cela dépend de ce que vous essayez d’échapper, je suppose. Normalement, ctrl + c tue simplement votre command et sleep et seulement casser si vous tuez true. - d33tah


Sonne comme la tâche idéale pour le cron démon qui permet d'exécuter des commandes périodiques. Exécuter le crontab -e commande pour commencer à modifier la configuration cron de votre utilisateur. Son format est documenté dans crontab (5). Fondamentalement, vous avez cinq champs séparés par un espace, 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 mardi, 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 avez besoin de créer un répertoire temporaire. De ma crontab (répertorié avec crontab -l):

# Creates a temporary directory for ~/.distcc at boot
@reboot ln -sfn "$(mktemp -d "/tmp/distcc.XXXXXXXX")" "$HOME/.distcc"

11
2018-03-07 18:54



La question demande comment exécuter quelque chose périodiquement dans le terminal. cron fonctionne dans les coulisses plutôt que dans le terminal - northern-bradley


Si vous surveillez le système de fichiers, inotifywait est brillant et ajoute certainement moins de charge sur votre système.

Exemple :

Dans 1er terminal tapez cette commande:

$ inotifywait .

Puis dans 2ème terminal, toute commande qui affecte le répertoire en cours,

$ touch newfile

Ensuite, dans le terminal d'origine, inotifywait va se réveiller et signaler 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.

5
2018-03-06 16:35



l'utilisateur vous a dit, pas de script, et peut-être qu'il ne veut rien surveiller - nux
Je ne lui ai pas dit d'écrire un script, j'ai suggéré que s'ils lisent pour regarder un événement de système de fichiers particulier, alors inotifywait est utile et utilise moins de ressources que de répéter une commande. Je lance souvent plusieurs commandes sur une ligne de commande, par exemple grep something InALogFile|less est-ce un script? - X Tian
C'est une bonne réponse, essayez de l'éditer pour qu'elle soit plus simple. - nux
Quoi de plus simple que . Je ne peux pas laisser la commande. - X Tian
Merci @XTian, ​​une excellente commande. J'ai aussi vu maintenant dans la page de manuel que vous pouvez ajouter -m surveiller continuellement sans boucle. - yoniLavi


Vous pouvez créer votre propre repeat commande faisant les étapes suivantes; crédits ici:

Tout d'abord, ouvrez 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

4
2017-08-08 19:38



il y a une petite faute de frappe dans la ligne xdg-open ~ / .bash-aliases. il devrait être: xdg-open ~ / .bash_aliases (ie: trait de soulignement) - ssinfod


vous pouvez utiliser crontab. lance la commande crontab -e et ouvrez-le avec votre éditeur de texte préféré, puis ajoutez cette ligne

*/10 * * * *  /path-to-your-command

Cela exécutera votre commande toutes les 10 minutes

* */4 * * *  /path-to-your-command

Cela va exécuter votre commande toutes les 4 heures

Une autre solution possible

$ ..some command...; for i in $(seq X); do $cmd; sleep Y; done

X nombre de fois à répéter.

Y temps d'attendre pour répéter.

Exemple :

$ echo; for i in $(seq 5); do $cmd "This is echo number: $i"; sleep 1;done

4
2018-03-07 05:57



Pourquoi est-ce une amélioration? Vous venez d'ajouter une étape supplémentaire inutile en enregistrant la commande en tant que variable. La seule chose que cela fait est de le rendre plus long pour taper ii) vous oblige à utiliser uniquement des commandes simples, pas de tuyaux ou de redirections, etc. - terdon♦
Supprimer la variable supplémentaire - Maythux