2009-09-13 10 views
10

Comment puis-je configurer un cronjob qui s'exécute toutes les 25 heures?Cronjob toutes les 25 heures?

+1

Quel est le but de ceci? Pourquoi 24 heures ne sont-elles pas acceptables? –

+0

Voir aussi: http://stackoverflow.com/questions/745901/how-to-do-a-cron-job-every-72-minutes – mob

+2

Came ici de Google avec un cas d'utilisation légitime, qui est d'éviter de dépasser un limite quotidienne d'API pour un travail périodique qui n'est pas particulièrement sensible au temps. Ajout d'une heure supplémentaire pour être prudent et éviter les bugs de l'heure d'été. – mahemoff

Répondre

16

Juste une supposition, mais vous ne pas

Meilleur bidouille du haut de ma tête: écrire un script pour suivre la dernière fois qu'il a été exécuté, et courir sous condition si elle était plus de 25 il y a des heures.

Cron ce script de pilote à exécuter toutes les heures.

7

Il serait plus facile d'exécuter une commande at spécifiant l'heure et la date du travail suivant lorsque vous démarrez le travail en cours mais vous pouvez simuler cela avec un cronjob en mettant à jour l'entrée de cronjob pour le processus au début du courant courir (pas à la fin 'cos, alors vous devez prendre en compte le temps d'exécution du travail).

+0

L'astuce 'at' peut échouer si vous manquez un travail, par exemple, si le système est arrêté lors de son exécution. –

0

Vous pouvez utiliser les commandes 'sleep' ou 'watch' pour exécuter un script en boucle. Assurez-vous simplement que votre script est exécuté.

2

Installation d'un emploi horaire et vérifiez dans votre script si 25 heures sont passées avec ce snipnet:

if [ $((((`date +%s` - (`date +%s` % 3600))/3600) % 25)) -eq 0 ] ; then 
your script 
fi 
+0

Plus de commentaires seraient appréciés. Ce code génère un horodatage (secondes depuis epoch), le convertit en heures et vérifie modulo 25 (donc toutes les 25 heures). Si nécessaire, remplacez "-eq 0" par "-eq 10" pour changer l'heure dans un jour spécifique ... – darkless

-1

Je pense que vous devriez essayer cette

0 */25 * * * ... 
+2

Vous ne pouvez pas définir une fréquence horaire supérieure à 23 – erdomester

+0

24 semble fonctionner dans Debian. –

1

Vous pouvez obtenir une fréquence si vous comptez les heures (, minutes, jours ou semaines) depuis Epoch, ajoutez une condition au début de votre script et définissez le script à exécuter toutes les heures sur votre crontab:

#!/bin/bash 

hoursSinceEpoch=$(($(date +'%s/60/60'))) 

# every 25 hours 
if [[ $(($hoursSinceEpoch % 25)) -ne 0 ]]; then 
    exit 0 
fi 

date(1) Retourne la date actuelle, nous mettre en forme en secondes depuis Epoch (%s) puis nous les mathématiques de base:

# .---------------------- bash command substitution 
# |.--------------------- bash arithmetic expansion 
# || .------------------- bash command substitution 
# || | .---------------- date command 
# || | | .------------ FORMAT argument 
# || | | |  .----- formula to calculate minutes/hours/days/etc is included into the format string passed to date command 
# || | | |  | 
# ** * * *  * 
    $(($(date +'%s/60'))) 
# * * --------------- 
# | |  | 
# | |  ·----------- date should result in something like "1438390397/60" 
# | ·-------------------- it gets evaluated as an expression. (the maths) 
# ·---------------------- and we can store it 

Et vous pouvez utiliser cette approche avec minutieusement, toutes les heures, tous les jours, ou des emplois Cron mensuels:

#!/bin/bash 
# We can get the 

minutes=$(($(date +'%s/60'))) 
hours=$(($(date +'%s/60/60'))) 
days=$(($(date +'%s/60/60/24'))) 
weeks=$(($(date +'%s/60/60/24/7'))) 

# or even 

moons=$(($(date +'%s/60/60/24/656'))) 

# passed since Epoch and define a frequency 
# let's say, every 13 days 

if [[ $(($days % 13)) -ne 0 ]]; then 
    exit 0 
fi 

# and your actual script starts here 
Questions connexes