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.