2008-10-29 5 views

Répondre

10

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 ne l'ai pas essayé personnellement, mais vous pouvez trouver quelques informations ici sur l'obtention de cron pour exécuter toutes les 90 minutes: http://keithdevens.com/weblog/archive/2004/May/05/cron

Un excert à partir du lien ci-dessus:

0 0,3,6,9,12,15,18,21 * * * <commands> 
30 1,4,7,10,13,16,19,22 * * * <commands> 
+1

Quelle exigence? La première phrase questionne la nécessité d'une heure et demie, la seconde fournit un billet de blog avec des informations sur la façon de le faire toutes les heures et demie. – vfilby

+1

Upvoted parce que l'article de blog répond correctement à la question. –

+0

Il ne faisait pas clairement référence à cela quand je l'ai voté. Il a été édité depuis pour préciser que le lien est à une solution potentielle pour la question de 90 minutes. – Alnitak

32

Ce n'est pas possible avec une seule expression en normale cron.

Le mieux que vous pouvez 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 compressible, selon la version de Cron, vous devez:

0 */3 * * * [cmd]

30 1-23/3 * * * [cmd]

4

Deux lignes dans la crontab. Sur le modèle 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 
1

Vous pouvez le faire avec deux entrées crontab.Chaque exécute toutes les trois heures et ils sont décalés de 90 minutes quelque chose comme ceci:

0 0,3,6,9,12,15,18,21 * * *

30 1,4,7, 10,13,16,19,22 * * *

0

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

@ 01h30 my_cmd 
1
#! /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 
-2

ajouté ce qui suit à mon crontab et travaille

15 */1 * * * root /usr/bin/some_script.sh >> /tmp/something.log 
+0

Pourriez-vous développer plus sur pourquoi c'est une bonne solution. –

1

*/10 * * * * root perl -e 'exit(time()%(90*60)>60)' && command

90 - il est l'un et une demi-heure en minutes

"> 60" - Je donne à cron capacité à retarder le début de l'écriture pendant une minute

également Avec l'aide de ce hack vous pouvez définir n'importe quelle période avec une résolution minute

Par exemple démarrer le script toutes les 71 minutes

* * * * * root perl -e 'exit(time()%(71*60)>60)' && command

0

Vous pouvez obtenir une fréquence si vous comptez les minutes (, heures, jours ou semaines) depuis Epoch, ajouter une condition au sommet de votre script, et définissez le script à exécuter toutes les minutes sur 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 formater en secondes depuis Epoch (%s) et nous faisons 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 

A 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 
+1

Salut stefanmaric, puisque vous semblez être ferme en la matière, s'il vous plaît ajouter la réponse à une seule des questions et signaler ceux qui sont de vrais doublons en tant que doublons de la meilleure combinaison question/réponse. – bummi

+0

Salut @bummi, j'ai effectivement recherché la fonction "marquer comme doublon". Je ne l'ai pas trouvé, alors j'ai posté. Faisant plus de recherche depuis ton commentaire, j'ai découvert que je n'ai pas assez de réputation pour signaler des questions: http://meta.stackexchange.com/questions/118124/dans-la-certaine-que-le-magasin-du-plat- -stack-overflow Merci pour les conseils et je suis désolé pour le spam. – stefanmaric

Questions connexes