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.
watch mysql dbname -e \"show processlist\;\"
brew install watch
la source
watch
a également le malheureux effet secondaire d'effacer l'écran, donc parfois la boucle est utile. Le choix dépend du format de sortie souhaité.--differences
pour les mettre en surbrillance (si vous êtes préoccupé par la repeinture du terminal)watch
. Watch ne fonctionne pas par exemple lorsque vous souhaitez générer un nombre aléatoire dans chaque appel, par exemplewatch -n 1 echo ${RANDOM}
. Le hasard ne sera appelé qu'une seule fois."watch" ne permet pas des fractions de seconde dans Busybox, tandis que "sleep" le permet. Si cela vous importe, essayez ceci:
la source
sleep
revient déjà0
. En tant que tel, j'utilise: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.
la source
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"'
la source
L'exécution périodique de commandes sans cron est possible lorsque nous allons avec
while
.Comme une commande:
Exemple:
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.Voici la même boucle qu'un script. Créez le fichier "while_check.sh" et mettez-le dedans:
Exécutez-le ensuite en tapant
bash ./while_check.sh &
la source
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.echo `date`
est juste une façon pauvre et légèrement boguée d'écrire justedate
. (Le bug a à voir avec le manque de citation de l'argument àecho
.) Voir aussi l' utilisation inutile deecho
.la montre est bonne mais nettoiera l'écran.
la source
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):
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.
la source
Si vous voulez faire quelque chose un certain nombre de fois, vous pouvez toujours le faire:
la source
for x in {1..300} ; do
commandes bash do||break;sleep 1.5; done
Vous pouvez exécuter ce qui suit et filtrer la taille uniquement. Si votre fichier a été appelé,
somefilename
vous pouvez procéder comme suitwhile :; do ls -lh | awk '/some*/{print $5}'; sleep 5; done
L'une des nombreuses idées.
la source
Pour minimiser plus facilement la dérive, utilisez:
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.
la source
Exécute la
ls -l
commande toutes les 5 secondesProduction :-
la source
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.
la source