2011-11-18 4 views
9

Voglio uno script da eseguire ogni 40 minuti a partire dal 40 ° minuto.
in modo che significa:Come impostare cron per eseguire il mio script ogni 40 minuti/25 minuti?

00:40, 01:20, 02:00, 02:40, 03:20... 

Così ho fatto questa voce a cron:

*/40 * * * * /path/to/script/foo.sh 

Purtroppo questo esegue lo script ogni 40 ° minuto dell'ora:

00:40, 01:40, 02:40... 

Lo stesso vale con lo script che intendevo eseguire ogni 25 minuti.

mi manca qualcosa qui?


RISPOSTE
Va bene, nel caso in cui vi capita di cadere da qui avendo lo stesso problema
ecco come ho risolto:

# 40mins-interval 
40 0 * * * /path/foo.sh   (0) 
0,40 2-22/2 * * * /path/foo.sh (2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22) 
20 1-23/2 * * * /path/foo.sh (1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23) 


# 25mins-interval 
25,50 0 * * * /path/foo.sh    (0) 
0,25,50 5-20/5 * * * /path/foo.sh  (5, 10, 15, 20) 
15,40 1-21/5 * * * /path/foo.sh   (1, 6, 11, 16, 21) 
5,30,55 2-22/5 * * * /path/foo.sh  (2, 7, 12, 17, 22) 
20,45 3-23/5 * * * /path/foo.sh   (3, 8, 13, 18, 23) 
10,35 4-19/5 * * * /path/foo.sh   (4, 9, 14, 19) 

Note:
1. Ci sarà ancora essere collisioni in questo programma (es .: vedere le pianificazioni che vengono eseguite sui minuti 0 e 10 su entrambi gli intervalli).
2. Lo script non verrà eseguito ad un intervallo esatto dalla sua ultima esecuzione oggi in corso il giorno successivo (cioè: intervallo 25min termina @ 23: 45 oggi, inizia @ 00: 25 il giorno successivo).

+1

leggere questo: http://stackoverflow.com/questions/745901/how-to-do-a-cron-job- ogni 72 minuti –

+1

Grazie! Questo fa schifo ma suppongo che dovrò fare l'impostazione 'manuale' degli intervalli come una soluzione sporca per ora. – cr8ivecodesmith

+0

So che sono passati 4 anni, ma potrei avere una soluzione per il cron di 25 minuti. Si potrebbe eseguire il cron ogni minuto (o ogni 5 minuti ..) e lo script rileverà se sono trascorsi 25 minuti. Se è vero, allora il tuo script farà il suo lavoro. – Kayla

risposta

10

Dividi sempre solo l'ora corrente.

40/40 = 1 quindi viene eseguito ogni 40 minuti di un'ora.

*/5 farebbe 5, 10, 15, 20, ...

Si dovrebbe andare per intervalli più grandi.

Do */30 per l'intervallo di 25 minuti e ogni 60 minuti per l'intervallo di 40 minuti.

Altrimenti istituito due crontabs per lo script:

0,40 */2 * * * /path/to/script/foo.sh 
20 1,3,5,7,11,13,15,17,19,21,23 * * * /path/to/script/foo.sh 
+0

Grazie per la spiegazione. Tuttavia, cambiare i miei intervalli è un no go. – cr8ivecodesmith

+0

Ho aggiunto un intervento per l'intervallo di 40 minuti. Con poco più lavoro che avrebbe funzionato anche per l'intervallo di 25 minuti. –

+0

Wow, questo sembra molto meglio. Grazie mille! :) – cr8ivecodesmith

4

Per l'operazione che si vuole realizzare è necessario scrivere un po 'più complessa voce nella crontab.

Vedi lo schema sopra?

00:40, 01:20, 02:00, 02:40, 03:20 e di nuovo 04:00, 04:40, 05:20, 06:00, 06:40, 07:20, 08 : 00

posso scomposizione in tre voci:

  1. Ogni anche ora bisogna farlo funzionare a minimo 40 °
  2. Ogni ora dispari devi eseguirlo al 20 ° min
  3. Ogni anche ora devi eseguirlo su 0.(Tranne 0 ore)

È possibile raggiungere questo obiettivo con più di un voci:

#1 
*/40 0,*/2 * * * /path/to/script/foo.sh 
#2 
*/20 1,*/2 * * * /path/to/script/foo.sh 
#3 
0 2,*/2 * * * /path/to/script/foo.sh 

NOTA: Potrebbe avere problemi minori, ma non mi ha dato il senso :)

PS: This will explain alot more

+0

Grazie! Vado con questo per ora. È brutto, ma ho bisogno di farlo subito. – cr8ivecodesmith

0

È necessario aggiungere più voci per lo stesso script a cron, uno per l'esecuzione all'ora, uno per venti e uno per tw enty all'ora.

0 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 
20 1,3,5,7,9,11,13,15,17,19,21,23 * * * script 
40 0,2,4,6,8,10,12,14,16,18,20,22 * * * script 

Si dice che dovrebbe iniziare alle 00:40, ma la corsa del giorno precedente sarà alle 23:20. Vuoi una pausa di 80 minuti nelle corse intorno a mezzanotte?

0
#! /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/75  # Executes everything in that directory every 75 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

È possibile ottenere qualsiasi frequenza se si contano i minuti (, ore, giorni o settimane) dal Epoch, aggiungere una condizione alla parte superiore del vostro script, e impostare lo script da eseguire ogni minuto sul tuo crontab : data

#!/bin/bash 

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

# every 40 minutes 
if [[ $(($minutesSinceEpoch % 40)) -ne 0 ]]; then 
    exit 0 
fi 

date(1) ritorna attuale, formattarlo in secondi dall'Epoca (%s) e poi facciamo la matematica di 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 

E si può utilizzare questo approccio con, giornaliera o oraria cron jobs mensili:

#!/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