Cron non funzionerà in un giorno specifico ma tutti gli altri giorni


8

Ho una configurazione cron per eseguire uno script bash ogni giorno alle 22:00. Ho un'altra configurazione cron da eseguire mensilmente il 1 ° del mese. Entrambi i croni lanciano uno script bash e l'unica differenza nello script bash è l'argomento che passano al programma java sottostante (emulazione del lancio della riga di comando del programma java).

Il problema è che devo disabilitare in qualche modo il cron giornaliero il 1 ° del mese in modo che entrambi non provino a funzionare lo stesso giorno. È possibile farlo automaticamente?

Suppongo di poter creare un altro script bash per modificare il cron prima del 1 ° e poi di nuovo per ripristinare le cose, ma questo sembra ... impuro.


non tutti i mesi hanno 31 giorni, questo non causerebbe un problema?
SnakeDoc,


una buona alternativa alla soluzione offerta da @suspectus
SnakeDoc il

2
o 2-31 per il campo del giorno del mese.
ash

@ash - vedi la mia risposta, è esattamente quello che ho suggerito.
slm

Risposte:


10

Analogamente alla soluzione proposta da @StephaneChazelas nei commenti, è possibile specificare l'intervallo di giorni nel 3 ° campo come intervallo per il cron su cui si desidera eseguire tutti i giorni oltre al 1 ° del mese.

Le seguenti due voci comporterebbero ciò che stai cercando:

   0 22 1 * *      /path/to/script/1st_of_the_month.bash    
   0 22 2-31 * *   /path/to/script/every_day_except_1st.bash

in realtà, non sembra funzionare per me (a meno che non stia facendo qualcosa di sbagliato) - la formattazione nei commenti è terribile - quindi vedi il mio pastbin per favore per quello che sto ottenendo: pastebin.com/RKvy5d4e
SnakeDoc

oops, dovrebbe essere 0 22 2-31 * * nel tuo esempio. lo modificherò.
SnakeDoc,

1
@SnakeDoc - grazie, tutte quelle colonne iniziano a fondersi dopo un po '8-)
SLM

sì, anche io li dimentico - li ho installati, poi ho dimenticato come l'ho fatto (buona cosa per la pagina man lol)
SnakeDoc

8

Il modo più semplice per affrontare questo è solo una voce cron. Modifica lo script bash per controllare la data - se è il 1 ° del mese, chiama il programma java con parametri mensili, altrimenti chiama il programma con i parametri giornalieri.

La modifica dello script rende il processo più semplice come lo script in quanto un documento descriverà meglio ciò che sta accadendo senza richiedere ulteriori informazioni in una tabella cron.

Le mod dello script potrebbero assomigliare a questo:

if [ $(date '+%d') == "1" ];then
   # monthly code
else
   # daily code
fi

1
ha finito per andare con questa soluzione. Ho creato un altro script bash con il tuo codice di esempio, e sotto il mensile - darà il via allo script bash mensile (che a sua volta alimenta l'argomento mensile al programma java sottostante), ogni giorno

0
if [ $(date '+%d') == "1" ];then
  # monthly code
else
   # daily code
fi

Penso che usando il confronto intero se più corretto

la data '+% d' restituisce 01 non 1 quindi l'utilizzo di == comparaison stringa sarà falso

anziché

if [ $(date '+%d') eq 1 ];then
    # monthly code
else
   # daily code
fi
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.