Při konfiguraci cronu tak, aby spouštěl příkaz každý druhý den pomocí pole „Den v měsíci“, například takto:
1 22 */2 * * COMMAND
spustí se pokaždé, když je den v měsíci lichý:1,3,5,7,9 a tak dále.
Jak mohu nakonfigurovat cron tak, aby běžel ve dnech v měsíci, které jsou dokonce jako 2, 6, 8, 10 a tak dále (aniž bych to doslovně specifikoval, což je problematické, protože každý měsíc má jiný počet dní v měsíci)?
Přijatá odpověď:
Syntaxe, kterou jste zkusili, je ve skutečnosti nejednoznačná. V závislosti na tom, kolik dní je v měsíci, některé měsíce poběží v liché dny a některé v sudé. Způsob výpočtu totiž bere celkový počet možností a rozděluje je. Toto podivné chování můžete potlačit ručním zadáním rozsahu dnů a použitím sudého nebo lichého počtu dnů. Vzhledem k tomu, že skripty sudého dne by se nikdy nespustily 31. den delších měsíců, neztratíte nic použitím 30 dnů jako základu pro sudé dny a tím, že konkrétně určíte rozdělení, jako by bylo 31 dnů, můžete vynutit liché -denní provedení.
Syntaxe by vypadala takto:
# Will only run on odd days:
0 0 1-31/2 * * command
# Will only run on even days:
0 0 2-30/2 * * command
Vaše obava z toho, že měsíce nemají stejný počet dní, zde není důležitá, protože žádný měsíc nemá VÍCE dní než tento, a pro chudý únor se rozsah dat nikdy nebude shodovat s posledním dnem nebo dvěma, ale neuškodí to. mít to uvedené.
Jediným problémem pro tento přístup je, že pokud jste v cyklu lichých dnů, následující měsíce s 31 dny se váš příkaz spustí také prvního v měsíci. Podobně, pokud vynucujete rovnoměrný cyklus, každý přestupný rok způsobí na konci února jeden třídenní cyklus. Opravdu nemůžete obejít skutečnost, že jakýkoli pravidelný vzorec „každý druhý den“ nebude vždy padat na sudé nebo liché dny v každém měsíci, a jakkoli si to vynutíte, buď budete mít běh navíc, nebo vám běh mezi nimi chybí. měsíce s neodpovídajícím počtem dnů.
Související:Linux – zkratka pro minimalizaci všech oken?