web-dev-qa-db-fra.com

Quelle est la meilleure façon d'effectuer une comparaison d'horodatage dans Bash

J'ai un script d'alerte que j'essaie d'empêcher de me spammer, donc je voudrais placer une condition selon laquelle si une alerte a été envoyée dans, disons la dernière heure, pour ne pas envoyer une autre alerte. Maintenant, j'ai un travail cron qui vérifie la condition toutes les minutes parce que je dois être alerté rapidement lorsque la condition est remplie, mais je n'ai pas besoin de recevoir l'e-mail pour chaque munite jusqu'à ce que le problème soit maîtrisé. Quelle est la meilleure façon de comparer le temps passé en bash pour y parvenir?

38
Ichorus

Le plus simple est de loin de stocker les horodatages comme heures de modification des fichiers factices. GNU touch et date les commandes peuvent définir/obtenir ces heures et effectuer des calculs de date. Bash a des tests pour vérifier si un fichier est plus récent que (-nt) ou plus ancien que (-ot) un autre.

Par exemple, pour envoyer une notification uniquement si la dernière notification remonte à plus d'une heure:

touch -d '-1 hour' limit
if [ limit -nt last_notification ]; then
    #send notification...
    touch last_notification
fi
63
Bruno De Fraine

Utilisez "test":

if test file1 -nt file2; then
   # file1 is newer than file2
fi

EDIT: Si vous voulez savoir quand un événement s'est produit, vous pouvez utiliser "touch" pour créer un fichier que vous pourrez comparer plus tard en utilisant "test".

19
JesperE

Utilisez la commande date pour convertir les deux fois dans un format standard et soustrayez-les. Vous voudrez probablement stocker le temps d'exécution précédent dans un fichier dot, puis faire quelque chose comme:

last = cat /tmp/.lastrun
curr = date '+%s'

diff = $(($curr - $last))
if [ $diff -gt 3600 ]; then
    # ...
fi

echo "$curr" >/tmp/.lastrun

(Merci, Steve.)

15
jonathan-stafford