web-dev-qa-db-fra.com

Comment puis-je configurer cron pour exécuter certaines commandes toutes les heures et demie?

Comment puis-je configurer cron pour exécuter certaines commandes toutes les heures et demie?

26
Nick Long

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]

34
Alnitak

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>
10
vfilby

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
1
user3174711

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 * * * 

1
Thomas DeGan

*/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

1
Alex

Vous pouvez également utiliser fcron qui accepte également des spécifications de temps plus complexes telles que:

@ 01h30 my_cmd
0
Christian Lescuyer

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
0
stefanmaric