Predtým som hovoril o vytvorení úlohy cron na posledný deň v mesiaci. Tentokrát vám ukážem, ako nastaviť úlohu cron, aby sa spúšťala každých toľko dní. Ako príklad použijeme každé tri dni.
Ak poznáte cron, pravdepodobne si pomyslíte: “To je jednoduché!” Áno, je. Tu je návod, ako to zvyčajne vidíme.
[code]
30 05 */3 * * vykonať_toto
[/code]
Vyššie uvedený kód spustí príkaz `execute_this` o 5:30 každé tri dni, ale ktorý je prvý deň, kedy sa spustí? Povedzme, že je úplne nový rok. Tvorcovia hluku idú a všetci kričia „Šťastný nový rok!“ Aký je prvý deň spustenia tohto príkazu? 1. januára? Vlastne nie. Bude 3. januára.
„*/3“ možno vnímať ako „každé číslo rovnomerne deliteľné tromi“. To znamená, že sa spustí vždy 3. dňa v mesiaci, 6. dňa v mesiaci, 9. dňa v mesiaci atď. To je v poriadku, ak to je to, o čo vám ide, ale často (napríklad účtovné úlohy) chcete, aby bežal na 1. v mesiaci, 4., atď. Ako to urobíme?
Keď to viete, je to veľmi jednoduché. Vidíte, že kombinácia hviezdičky a lomítka, ktorú často vidíme v crontaboch, nie je jediný spôsob, ako ísť. Nemusí to byť hviezdička; môže to byť akákoľvek iná hodnota.
[code]
30 05 1-31/3 * * vykonať_toto
[/code]
Tento sa začne 1. dňa a bude prebiehať každé tri dni až do 31. dňa (vrátane). Takto dosiahneme, že posun začne 1.
Ale to NAOZAJ NIE JE každé tri dni!
Nie, v skutočnosti to nie je každé tri dni. Každé tri dni , ale nový mesiac sa resetuje ako prvý bez ohľadu na to, kedy bol naposledy spustený. A opäť je dobré, ak o to ide.
Ak skutočne potrebujete každé tri dni v roku, tu je pre vás bonus. Budeme musieť zabezpečiť, aby to fungovalo podobne ako v našom triku „posledný deň v mesiaci“, kde sme nastavili úlohu cron tak, aby sa spúšťala každý z možných posledných dní v mesiaci a samotný príkaz kontroloval dátum.
Pre túto úlohu budeme chcieť, aby sa úloha cron spúšťala každý deň, potom skontrolujeme, či je deň v roku rovnomerne deliteľný tromi – po započítaní, že náš offset začína 1. v roku.
Príkaz pre „deň v roku“ je [code]dátum +%-j[/code] Kde spojovník pred „j“ znamená „nevypĺňať“ (v tomto prípade s nulami – takže ho môžeme použiť ako číslo). Teraz len skontrolujeme, či je to rovnomerne deliteľné tromi pomocou modulo – % – ktoré vráti zvyšok delenia.
[code]
$(( `dátum +%-j` % 3))
[/code]
Časť $(()) hovorí bashovi, aby vykonal výpočet, a spätné značky slúžia na spustenie nášho príkazu dátumu oddelene od zvyšku. Ak je teda tento výpočet nulový, máme víťaza.
[code]
[ $(( `date +%-j` % 3 )) == 0 ]
[/code]
Pamätajte však, že potrebujeme posun, aby sme začali 1. Tak ako je to momentálne, začína sa 3. Len odpočítaním jedného od dňa v roku môžeme dostať všetko do radu. Tento výpočet musíme tiež zabaliť do $(( )).
[code]
[ $(( $(( `date +%-j` – 1 )) % 3 )) == 0 ]
[/code]
Tento test spĺňa naše podmienky, takže náš úplný záznam v crontab by bol:
[code]
30 05 ** [ $(( $(( `date +%-j` – 1 )) % 3 )) == 0 ] && vykonať_toto
[/code]