GNU/Linux >> Linux Esercitazione >  >> Linux

In Crontab modo generico per specificare ogni n min dove n > 60

Devi solo fare i conti da solo per trovare i lavori richiesti per raggiungere il tuo tempismo.

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

Un semplice algoritmo può essere concluso da questi due esempi (con 30 minuti di differenza):

  • Aggiungi due voci:una con offset di 0 minuti e un'altra con offset di 30 minuti.
  • Specifica la larghezza dell'intervallo di ore uguale a duration * 2 .
  • Specifica l'offset orario:uno inizia con 0 e l'altro inizia con la durata dopo aver scartato la parte di 30 minuti.

Se pensi di più, puoi trovare soluzioni simili per qualcosa come ogni 75 minuti.

Modifica:

Cron non può essere utilizzato per tutti i tipi di lavori pianificati. Ad esempio, eseguire un lavoro una volta al mese l'ultimo giorno del mese. Non puoi semplicemente farlo con cron perché l'ultimo giorno del mese cambia da un mese all'altro. Per risolvere questo problema, puoi eseguire un cron job nel possibile intervallo di valori dell'ultimo giorno del mese (28-31) e verificare che sia davvero l'ultimo giorno o meno nello script prima di eseguire il lavoro vero e proprio.


Inserisci il risultato del comando

date +%s

in una variabile nel tuo crontab. Qualcosa come TIME=1497950105. Ora nel tuo crontab hai bisogno di una voce come

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && TIME=$(date +\%s) && whatever'

Dove secondi è il numero di secondi che desideri (12600 nel tuo caso).

O se vuoi aspettare 3 ore e 30 minuti dopo il completamento del programma

* * * * * /bin/bash -c '[[ $(($(date +\%s)-TIME)) -gt seconds ]] && whatever && TIME=$(date +\%s)'

Modifica: Ho corretto la mia risposta precedente:

  • devi evitare il segno % con \, quindi %s diventa \%s
  • devi far precedere il comando da /bin/bash -c

Un'altra soluzione (senza usare TIME) è:

 * * * * * /bin/bash -c '[[ $((($(date +\%s) / 60) % minutes)) -eq 0 ]] && whatever'

Dove i minuti sono 210 nel tuo caso.

Modifica 2:

Come suggerito da MSalters è meglio eseguire la voce ogni N minuti, dove N è il massimo comune divisore tra 60 e il tuo intervallo di tempo in minuti


In questo caso penso che tu stia semplicemente cercando di usare cron per fare qualcosa che non è in grado di fare da solo (ovviamente ad eccezione delle soluzioni in cui cron esegue periodicamente uno script di supporto, nel qual caso direi che non è cron stesso risolvendo il problema).

La soluzione con l'intervallo di 3 ore e 30 minuti non è del tutto corretta. Questa era la soluzione data:

0 0-23/7 * * * whatever
30 3-23/7 * * * whatever

Il motivo per cui questo è sbagliato è perché cron eseguirà il lavoro alle 21:00 e alle 00:00, che è un intervallo di 3 ore anziché 3 ore e 30 minuti.

Una soluzione generale per tutti gli intervalli di tempo dovrebbe essere in grado di gestire casi che non si dividono uniformemente in 24 ore. Sebbene non si divida equamente in 24 ore, si divide equamente in una settimana! Il modo più semplice di pensare a questo è fare due serie sovrapposte di "ogni 7 ore", come questa:

0 0-23/7 * * 1 whatever
0 4-23/7 * * 2 whatever
0 1-23/7 * * 3 whatever
0 5-23/7 * * 4 whatever
0 2-23/7 * * 5 whatever
0 6-23/7 * * 6 whatever
0 3-23/7 * * 7 whatever
30 3-23/7 * * 1 whatever
30 0-23/7 * * 2 whatever
30 4-23/7 * * 3 whatever
30 1-23/7 * * 4 whatever
30 5-23/7 * * 5 whatever
30 2-23/7 * * 6 whatever
30 6-23/7 * * 7 whatever

Qualcosa che è divisibile per una settimana è il meglio che puoi fare, perché i mesi non si allineano perfettamente con le settimane, ed è l'unico modo in cui è fattibile. Ad esempio, un intervallo di esattamente ogni 12 minuti è banale in una riga di crontab, ma un intervallo di esattamente ogni 11 minuti è impossibile, perché 10080 non è divisibile per 11. (10080 è il numero di minuti in una settimana).

Sarebbe sicuramente possibile scrivere un algoritmo per risolvere i casi in cui ciò è possibile, ma chiaramente non vale molto, soprattutto considerando come sarebbero effettivamente le soluzioni.


Linux
  1. Dov'è il registro cron / crontab? / Come abilitare il Cron Log?

  2. Modo per specificare che una sezione di una pipeline sia completamente "passa attraverso"?

  3. Dove posso impostare le variabili di ambiente che crontab utilizzerà?

  4. Come specificare un editor per aprire il file crontab? export EDITOR=vi non funziona

  5. Come eseguire crontab job ogni settimana di domenica

Come eseguire un lavoro Crontab ogni settimana la domenica

Perché Linux è così cattivo e Windows 11 è migliore in ogni singolo modo?

HDDTemp crontab ogni ora nel file

Esempio Crontab – ogni 5 minuti

C'è un modo per smettere di dover scrivere 'sudo' per ogni piccola cosa in Linux?

Come posso montare una partizione ad ogni riavvio?