Bonne méthode pour comparer le temps?

10

Je dois vérifier l'heure actuelle et abandonner le script si ce n'est pas le bon moment de la journée, je suis censé l'exécuter. De plus, si quelqu'un d'autre l'exécute, il devrait abandonner.

Par exemple: J'ai besoin que mon script ne s'exécute que s'il est démarré entre 22 h 00 et 2 h 00 (une fenêtre de 4 heures).

Actuellement, je fais ce qui suit. Prendre le temps date +%k%Met comparer avec des nombres codés en dur

#!/bin/sh
currTime=`date +%k%M`
check_time_to_run()
{
    tempTime=$1
    if [ $tempTime -gt 200 -a $tempTime -lt 2200 ]; then 
        echo "Time is between 2 AM and 10 PM. Aborting."
        exit 1
    else
        echo "Time is after 10 PM and before 2 AM. Running normally."
    fi
}

check_time_to_run $currentTime

Je voudrais savoir s'il existe une autre méthode efficace en ce qui concerne la comparaison du temps dans shou bash?

mtk
la source
1
Si vous avez besoin de comparer deux dates essayer de les convertir en temps MJD ou UNIX, par exemple: date +%s.
Eddy_Em
1
@Eddy non ce n'est pas la date, c'est le temps dont j'ai besoin pour comparer.
mtk
1
Je pense qu'en quelques secondes ce serait mieux: currTime=$(date +%s); lower=$(date +%s --date="2:00"); upper=$(date +%s --date="22:00"); if [$currTime -gt $lower -a $currTime -lt $upper]; then
Eddy_Em
pourquoi ne pas mettre le script dans la crontab? de cette façon, vous vous assurez qu'il s'exécute à ce moment précis
BitsOfNix
1
Comme tout utilisateur peut modifier l'heure d'un processus avec faketime, votre script n'est pas très sûr. L'utilisation de fichiers de verrouillage est probablement une meilleure option.
jofel

Réponses:

6

Cela me semble parfait. Qu'est-ce qui vous fait penser qu'il devrait être amélioré?

Quoi qu'il en soit, les moyens de l'améliorer pourraient être:

  • Utilisez un shell plus petit et plus rapide que bash comme dash ou pdksh.
  • utiliser un shell qui a des capacités de date intégrées comme zshouksh93
  • use gawk(qui est plus petit que bash, mais pas que dash mais pourrait éviter le fork supplémentaire):

Exemple:

#! /usr/bin/gawk -f
BEGIN {now = strftime("%k%M")+0; exit(now > 200 && now < 2200)}
Stéphane Chazelas
la source
OK cool. Je voulais juste confirmer que ce que je fais n'est ni grossier ni mauvais. Merci pour les suggestions.
mtk
4

Si les outils externes sont autorisés, vous voudrez peut-être vérifier dateutils.

Votre "script" devient:

if dtest time --gt '02:00:00' && dtest time --lt '22:00:00'; then
    echo "Time is between 2 AM and 10 PM. Aborting."
fi

Avertissement: je suis l'auteur dudit outil.

hroptatyr
la source