2014-04-14 21 views
7

Sto provando a eseguire questo script ogni 5 minuti. Sembra che l'unico modo per eseguire i lavori CRON su OpenShift sia utilizzare il loro plugin CRON. E il plugin CRON consente solo script minuziosi, orari e quotidiani (posizionando lo script nella cartella corrispondente).Eseguire il lavoro CRON ogni 5 minuti su OpenShift (Red Hat Cloud)

Sto cercando di eseguire questo script ogni 5 minuti:

#!/bin/bash 
php /var/lib/openshift/53434c795973ca1ddc000668/app-root/runtime/repo/scheduled.php > /dev/null 2>&1 

Ma adesso si corre ogni minuto (perché è inserito nella cartella minuziosamente).

Come posso riscriverlo in modo che venga eseguito ogni 5 minuti?

risposta

10

Modificare lo script in modo che controlli l'ora corrente e viene richiamato se non è un multiplo di 5 minuti.

Qualcosa di simile a questo:

#!/bin/bash 

minute=$(date +%M) 
if [[ $minute =~ [05]$ ]]; then 
    php ... 
fi 

Il diritto operando dell'operatore =~ è un'espressione regolare; le corrispondenze di cui sopra se il minuto corrente termina con 0 o 5. Diversi altri approcci sono possibili:

if [[ $minute =~ .[05] ]]; then 

(Controlla ogni carattere seguito da un 0 o 5; $minute è sempre esattamente 2 caratteri).

(theshadowmonkey utente suggerisce in un commento:.

if [ $(($minute % 5)) -eq 0 ]; then 

che controlla aritmeticamente se $minute è un multiplo di 5, ma c'è un problema con questo Nell'espressione in un'espressione $((...)), costanti con gli zeri sono trattati come ottale, se è attualmente 8 o 9 minuti dopo l'ora, la costante 08 o 09 è un errore si potrebbe ovviare a questo con sed, ma non è probabilmente vale la pena dato che ci sono altre soluzioni)

+1

La risposta di cui sopra è sbagliata ed esegue ogni minuto di minuto 50-59. Quindi il cambiamento sarebbe il condizionale a "se [$ (($ minuto% 5)) -eq 0], quindi" e funziona. Per qualche motivo la mia modifica è stata respinta. Quindi, sto solo lasciando la risposta corretta nel commento. L'autore o qualcuno si sentono liberi di modificare la risposta con questa affermazione. – theshadowmonkey

+1

@theshadowmonkey: Fatto. Grazie per averlo capito. Ho incluso diverse alternative (che potrebbero essere eccessive). –

+1

@theshadowmonkey quando si utilizza if [$ (($ minute% 5)) -eq 0]; poi ottengo errore: 08: valore troppo grande per base (il token di errore è "08") –

8

io.. sarà e xtend Keith Thompson risposta:

La sua soluzione funziona perfettamente per ogni 5 minuti, ma non funzionerà per, diciamo, ogni 13 minuti; se usiamo $minutes % 13 otteniamo questo programma:

5:13 
5:26 
5:30 
5:52 
6:00 because 0%13 is 0 
6:13 
... 

sono sicuro che si nota il problema.Siamo in grado di realizzare qualsiasi frequenza se contiamo i minuti (, ore, giorni o settimane) dal Epoch:

#!/bin/bash 

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

if [[ $(($minutesSinceEpoch % 13)) -eq 0 ]]; then 
    php [...] 
fi 

date(1) rendimenti data corrente, abbiamo formattarla 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 sulla OpenShift:

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

Noti ce ho usato l'operatore -ne (non uguale) per uscire dallo script invece di usare l'operatore -eq (uguale) per avvolgere lo script nella costruzione IF; Lo trovo a portata di mano.

E ricordarsi di utilizzare la cartella .openshift/cron/{minutely,hourly,daily,weekly,monthly}/ corretta per la frequenza.

0

È possibile utilizzare min. cron job disponibile. I lavori vengono eseguiti a una frequenza specificata e puoi istruire il tuo lavoro per ispezionare la data e/o l'ora di esecuzione del tuo lavoro.

Ecco un esempio per l'esecuzione di un lavoro ogni 5 minuti. Inserisci lo snippet di codice seguente in un file eseguibile nel percorso .openshift/cron/minutely/awesome_job e fornisci le autorizzazioni appropriate chmod +x awesome_job quindi aggiungilo al repository dell'applicazione, esegui il commit e premi.

Il frammento

#!/bin/bash 
if [ ! -f $OPENSHIFT_DATA_DIR/last_run ]; then 
    touch $OPENSHIFT_DATA_DIR/last_run 
fi 
if [[ $(find $OPENSHIFT_DATA_DIR/last_run -mmin +4) ]]; then #run every 5 mins 
    rm -f $OPENSHIFT_DATA_DIR/last_run 
    touch $OPENSHIFT_DATA_DIR/last_run 
    # The 'awesome_command(s)' that you want to run every 5 minutes 
fi 

Spiegazione:

  • Questo frammento di codice in realtà crea un file vuoto denominato 'last_run' solo per nota giù l'ultimo stato di marcia e poi inizia il tuo lavoro.
  • Il minuto successivo, il tuo 'awesome_job' verrà eseguito e ora cerca di trovare il file 'last_run' modificato negli ultimi 4 minuti. Ma il tuo file 'last_run' è stato creato solo un minuto fa e quindi la condizione fallisce ed esce. Questo continua.
  • Al quinto minuto, mentre si trova (con -mmin +4), verrà visualizzato il proprio 'last_run' e ora il file 'last_run' verrà eliminato e ricreato e verranno eseguiti i comandi desiderati.

Fonte (Gazzetta Docs): https://developers.openshift.com/managing-your-applications/background-jobs.html#_execution_timing