Comment puis-je configurer cron pour exécuter certaines commandes toutes les heures et demie?
Ce n'est pas possible avec une seule expression dans la variable normale cron
.
Le mieux que vous puissiez faire sans modifier le code est:
0 0,3,6,9,12,15,18,21 * * * [cmd]
30 1,4,7,10,13,16,19,22 * * * [cmd]
Ces pourraient être compressibles, selon la version de cron, vous devez:
0 */3 * * * [cmd]
30 1-23/3 * * * [cmd]
Y a-t-il une bonne raison pour laquelle vous ne pouvez pas utiliser 1 heure ou 2 heures? Ce serait plus simple à coup sûr.
Je n'ai pas essayé cela personnellement, mais vous pouvez trouver des informations ici pour que cron fonctionne toutes les 90 minutes: http://keithdevens.com/weblog/archive/2004/May/05/cron
Un extrait du lien ci-dessus:
0 0,3,6,9,12,15,18,21 * * * <commands>
30 1,4,7,10,13,16,19,22 * * * <commands>
Deux lignes dans la crontab. Le long des lignes de:
0 0,3,6,9,12,15,18,21 * * * /usr/bin/foo
30 1,4,7,10,13,16,19,22 * * * /usr/bin/foo
#! /bin/sh
# Minute Cron
# Usage: cron-min start
# Copyright 2014 by Marc Perkel
# docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron"
# Free to use with attribution
# Run this script under Cron once a minute
basedir=/etc/cron-min
if [ $# -gt 0 ]
then
echo
echo "cron-min by Marc Perkel"
echo
echo "This program is used to run all programs in a directory in parallel every X minutes."
echo
echo "Usage: cron-min"
echo
echo "The scheduling is done by creating directories with the number of minutes as part of the"
echo "directory name. The minutes do not have to evenly divide into 60 or be less than 60."
echo
echo "Examples:"
echo " /etc/cron-min/1 # Executes everything in that directory every 1 minute"
echo " /etc/cron-min/5 # Executes everything in that directory every 5 minutes"
echo " /etc/cron-min/13 # Executes everything in that directory every 13 minutes"
echo " /etc/cron-min/90 # Executes everything in that directory every 90 minutes"
echo
exit
fi
for dir in $basedir/* ; do
minutes=${dir##*/}
if [ $(( ($(date +%s) / 60) % $minutes )) -eq 0 ]
then
for program in $basedir/$minutes/* ; do
if [ -x $program ]
then
$program &> /dev/null &
fi
done
fi
done
Vous pouvez le faire avec deux entrées crontab. Chacune fonctionne toutes les trois heures et elles sont compensées par 90 minutes à peu près comme ceci:
0 0,3,6,9,12,15,18,21 * * *
30 1,4,7,10,13,16,19,22 * * *
*/10 * * * * root Perl -e 'exit(time()%(90*60)>60)' && command
90 - c'est une heure et demie en minutes
"> 60" - Je donne à cron la possibilité de retarder le début du script pendant une minute
Aussi, avec l'aide de ce hack, vous pouvez définir n'importe quelle période avec une résolution minute
Par exemple, lancez le script toutes les 71 minutes
* * * * * root Perl -e 'exit(time()%(71*60)>60)' && command
Vous pouvez également utiliser fcron qui accepte également des spécifications de temps plus complexes telles que:
@ 01h30 my_cmd
Vous pouvez obtenir n'importe quelle fréquence si vous comptez les minutes (, heures, jours ou semaines) depuis Epoch , ajoutez une condition en haut de votre script et configurez le script pour qu'il s'exécute toutes les minutes dans votre crontab:
#!/bin/bash
minutesSinceEpoch=$(($(date +'%s / 60')))
# every 90 minutes (one and a half hours)
if [[ $(($minutesSinceEpoch % 90)) -ne 0 ]]; then
exit 0
fi
date(1)
retourne la date actuelle, nous la formatons en secondes depuis Epoch (%s
), puis nous faisons les calculs 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 des tâches cron horaires, quotidiennes ou mensuelles:
#!/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 7 hours
if [[ $(($hours % 7)) -ne 0 ]]; then
exit 0
fi
# and your actual script starts here