Come programmare un cronjob bisettimanale?


10

crontab (5) definisce i seguenti campi:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

e spiega:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

Quindi, nessun lavoro bisettimanale, per quanto riguarda la mia comprensione. Sono abbastanza sicuro che ci sono soluzioni alternative, quali sono le tue? O mi sono perso qualcosa?


2
La migliore risposta che posso trovare su questo è qui: unix.stackexchange.com/questions/1224/…
Somantra

... e quelle risposte su U&L sarebbero il modo in cui lo farei, @Somantra :-)
voretaq7

@ voretaq7, avrei detto che era la risposta canonica, ma non volevo presentarmi come pedante ;-)
Somantra,

Risposte:


8

Puoi fare eseguire la cosa da cron ogni mercoledì, quindi far decidere se è una settimana pari o una settimana dispari. per esempio:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

Questa è una buona soluzione, tuttavia, in realtà non risponde alla domanda stessa: preferirei non contaminare la cosa con la logica del programma. Forse posso integrarlo con il link fornito da @Somantra.
Roman

Va bene, devo ammetterlo: questa è la soluzione migliore finora. Il link che @Somantra ha dato ottiene gli stessi risultati IMHO inutilmente complessi (contando con il tempo UNIX), ma aggiungendo il tuo approccio direttamente al cronjob (invece che nello script) nello stesso stile lo rende abbastanza elegante.
Roman

Questo si interrompe nel 2020 perché ha 53 settimane. Esempio: se il tuo cron è programmato per essere eseguito ogni due settimane il 31 dicembre, verrà eseguito il 31 dicembre 2020 (53a settimana) e il 4 gennaio 2020 (1a settimana).
mad_fox,

4

Molti croni (non hai specificato quale stai usando) supportano gli intervalli. Quindi qualcosa del genere

0 0 1-7,15-21 * 3

Colpirà il primo e il terzo mercoledì del mese.


questo è leggermente più elegante del metodo "fallo nello script", ma ricorda di aggiungere un commento al tuo crontab (regola generale: se ne hai più di uno -o sei /coinvolto, probabilmente vale la pena commentare per descrivere il programma)
voretaq7

Sospetto che sia sbagliato; causerà l'esecuzione del lavoro dal 1 ° al 7 °, e dal 15 al 21, di ogni mese e anche ogni mercoledì. Questo da man 5 crontab: " Il giorno dell'esecuzione di un comando può essere specificato da due campi: giorno del mese e giorno della settimana. Se entrambi i campi sono limitati (ovvero, non lo sono *), il comando verrà eseguito quando uno dei campi corrisponde al ora corrente. Ad esempio, "30 4 1,15 * 5" farebbe eseguire un comando alle 4:30 del mattino il 1 ° e il 15 di ogni mese, più ogni venerdì "(la mia enfasi).
MadHatter,

1
In realtà, dipende dal demone cron che stai usando. La tua voce sembra provenire da vixie cron (incluso nelle distribuzioni RedHat). Da "man crontab" sul cron di dillo (Slackware): se specifichi sia un giorno del mese che un giorno della settimana, * verrà interpretato come l'ennesimo giorno del mese *. Tuttavia, una soluzione con script (calcolo del numero della settimana) sembra l'unica soluzione portatile.
AlvaroGMJ,

2

Per qualcosa che deve essere eseguito a settimane alterne, utilizzare questo one-liner:

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

Questo particolare script è programmato per essere eseguito il venerdì. La settimana da eseguire può essere regolata usando "-eq 0" o "-eq 1"


1

Anacron è una buona soluzione per i limiti di cron.

  • Anacron ha un parametro Periodo di ricorrenza che è possibile impostare su 14.

comando ritardo identificativo lavoro

14 15 test.daily /path/to/script.sh


Sfortunatamente, Anacron non può essere usato. Ho dimenticato di menzionarlo.
Roman

1

Se le tue esigenze non sono letteralmente bisettimanali, potresti semplicemente eseguire il cronjob il 1 ° e il 15 del mese:

15 8 1,15 * * /your/script.sh

Che corre alle 8:15 il primo e il quindicesimo di ogni mese indipendentemente dal giorno della settimana.


-2

Da quella spiegazione l'impostazione 3/2 nel campo della settimana dovrebbe eseguire l'attività ogni altro mercoledì - è implicito, ma penso fattibile.


no, questo equivale a for(int i=3; i <=3 ; i+=2) {} dal momento che lo sta attraversando solo una volta, non importa se il "passo" è 1 o 2.
stufare il

Cosa ha detto @stew. Inoltre, non esiste un "campo settimanale".
Roman

Per campo settimanale, intendo il "campo del giorno della settimana"
Journeyman Geek,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.