CronTriggers Tutorial

NEZ

23. 8. 2014 | Martin Halama | Nezařazené

CronTriggers TutorialCron je nástroj UNIXu, který se již nějakou dobu používá, tudíž jeho schopnosti ve věcech plánování jsou výkonné a časem prověřené. Třída Cron Trigger je založena na plánovacích schopnostech Cronu.

Cron Trigger využívá výrazů užívaných v Cronu, které mohou vytvářet plány pro spuštění (aplikací) jako např. "V 8:00 ráno od pondělí do pátku," nebo "V 1:30 ráno každý poslední pátek v měsíci."

Výrazy užívané v Cronu jsou velmi výkonné, ale mohou být zmatečné. Tento tutorial se snaží osvětlit některé ze záhad týkajících se vytváření výrazů v Cronu a pokouší se být pro uživatele zdrojem informací, na který se mohou obrátit dříve, než se budou dotazovat na fórech uživatelů nebo psát vlastním výrobcům (administrátorům).

Formát

Výraz v Cronu je řetězec, který sestává ze šesti nebo sedmi polí oddělených mezerou. Pole mohou obsahovat kteroukoliv z povolených hodnot a dále různé kombinace znaků povolených v daném poli. Tato pole jsou:

Jméno pole Povinný (údaj) Povolené hodnoty Povolená písmena a znaky
Sekundy ANO 0-59 , - * /
Minuty ANO 0-59 , - * /
Hodiny ANO 0-23 , - * /
Den v měsíci ANO 1-31 , - * ? / L W
Měsíc ANO 1-12 nebo JAN-DEC , - * /
Den v týdnu ANO 1-7 nebo SUN-SAT , - * ? / L #
Rok NE prázdný, 1970-2099 , - * /

Takže výrazy v Cronu mohou být takto jednoduché: * * * * ? *, anebo takto složité: 0 0/5 14,18,3-39,52 ? JAN,MAR,SEP MON-FRI 2002-2010.

Speciální znaky

  • * ("všechny hodnoty") – používá se pro výběr všech hodnot v rámci vybraného pole. Např. "*" v poli týkajících se minut, znamená "každou minutu".
  • ? ("žádná konkrétní hodnota") - znak je užitečný, když potřebujete konkretizovat něco v jednom ze dvou polí, ve kterých je znak povolen. Např. pokud chcete spustit aplikaci v určitý den v měsíci (třeba desátého), ale nezajímá vás, co je to za den v týdnu, napíšete "10" do pole týkajícího se dne v měsíci a "?" do pole týkajícího se dne v týdnu. Viz příklady níže.
  • - - používá se pro určení rozpětí. Např. "10-12" v poli týkajícím se hodin znamená "hodiny 10, 11 a 12".
  • , - používá se při konkretizaci dalších (přídavných) hodnot. Např. "MON,WED,FRI" v poli pro dny v týdnu znamená "dny pondělí, středa a pátek".
  • / - používá se pro stanovení přírůstků (násobků). Např. "0/15" v poli pro vteřiny znamená "vteřiny O, 15, 30 a 45". Zápis "5/15" v poli pro vteřiny znamená "vteřiny 5, 20, 35 a 50". V zápise můžete též uvést specifikaci '/' po "znaku – v tomto případě" znamená to samé jako '0' před '/'. '1/3' v poli den v měsíci znamená "spustit aplikaci každé 3 dny a začít (s tím) první den v měsíci".
  • L ("last", "poslední") – má jiný význam v každém ze dvou polích, ve kterých je povoleno. Např. hodnota "L" v poli den v měsíci znamená "poslední den v měsíci" – tedy 31. v lednu, 28. v únoru v nepřestupném roce. Pokud se samostatně použije v poli den v týdnu, znamená jednoduše "7" neboli "SAT" (sobota). Je-li použito v poli den v týdnu společně s další hodnotou, znamená to "poslední xxx den v měsíci" – např. "6L" znamená "poslední pátek v měsíci". Při používání funkce 'L' je důležité NEspecifikovat seznamy nebo rozpětí hodnot, protože tak byste dostali nesprávné výsledky.
  • W ("weekday" "pracovní den") – používá se při specifikaci pracovního dne (pondělí-pátek) nejblíže danému dnu. Např. uvedete-li "15W" jako hodnotu do pole den v měsíci, znamená to "nejbližší pracovní den k 15-tému dni v měsíci". Tudíž, připadá-li 15. den v měsíci na sobotu, aplikace bude spuštěna v pátek 14-náctého. Je-li 15. den v měsíci neděle, aplikace bude spuštěna v pondělí 16-tého. Je-li 15-tého úterý, bude aplikace spuštěna v úterý 15-tého. Uvedete-li však hodnotu "1W" jako hodnotu pro den v měsíci a prvního bude sobota, aplikace bude spuštěna v pondělí třetího, protože se "nepřeskočí" hranice dnů v měsíci. Znak 'W' může být použit pouze tehdy, když den v měsíci je jen jeden den a nikoliv rozpětí nebo seznam dnů.
  • # - používá se při specifikaci určitého dne v pořadí v měsíci. Např. hodnota "6#3" v poli den v týdnu znamená "třetí pátek v měsíci" (den 6 = pátek, "#3" = třetí v měsíci). Další příklady: "2#1" = první pondělí v měsíci a "4#5" = pátá středa v měsíci. Povšimněte si, že aplikace nebude spuštěna, uvedete-li "#5" a v daném měsíci nebude žádný pátý příslušný den v týdnu.

Znaky 'L' a 'W' lze v poli den v měsíci sloučit jako 'LW', což v překladu znamená "poslední den v měsíci".

U povolených znaků a názvů měsíců a dnů v týdnu nezáleží na tom, zda píšete malá nebo velká písmena. MON je stejné jako mon.

Pozn.: v anglicky mluvících zemích je posledním dnem v týdnu SOBOTA nikoliv NEDĚLE jako u nás.

Příklady

Výraz Význam
0 0 12 * * ? Spustit aplikaci každý den ve 12:00 (poledne)
0 15 10 ? * * Spustit aplikaci každý den v 10:15 dopoledne
0 15 10 * * ? Spustit aplikaci každý den v 10:15 dopoledne
0 15 10 * * ? * Spustit aplikaci každý den v 10:15 dopoledne
0 15 10 * * ? 2005 Spustit aplikaci každý den v 10:15 dopoledne v průběhu roku 2005
0 * 14 * * ? Spustit aplikaci každý den každou minutu mezi 14:00 a 14:59
0 0/5 14 * * ? Spustit aplikaci každý den každých 5 minut mezi 14:00 a 14:55
0 0/5 14,18 * * ? Spustit aplikaci každý den každých 5 minut mezi 14:00 a 14:55, A spustit aplikaci každý den každých 5 minut mezi 18:00 a 18:55
0 0-5 14 * * ? Spustit aplikaci každý den každou minutu mezi 14:00 a 14:05
0 10,44 14 ? 3 WED Spustit aplikaci ve 14:10 a ve 14:44 každou středu v měsíci březnu
0 15 10 ? * MON-FRI Spustit aplikaci v 10:15 dopoledne každé pondělí, úterý, středu, čtvrtek a pátek
0 15 10 15 * ? Spustit aplikaci v 10:15 dopoledne 15. den každého měsíce
0 15 10 L * ? Spustit aplikaci v 10:15 dopoledne poslední den každého měsíce
0 15 10 ? * 6L Spustit aplikaci v 10:15 dopoledne poslední pátek každého měsíce
0 15 10 ? * 6L 2002-2005 Spustit aplikaci v 10:15 dopoledne každý poslední pátek každého měsíce v průběhu let 2002, 2003, 2004 a 2005
0 15 10 ? * 6#3 Spustit aplikaci v 10:15 dopoledne třetí pátek každého měsíce
0 0 12 1/5 * ? Spustit aplikaci každých pět dní každého měsíce ve 12:00 (poledne) od prvního dne v měsíci
0 11 11 11 11 ? Spustit aplikaci každého 11. listopadu v 11:11 dopoledne

Věnujte pozornost významům znaku '?' a '*' v polích den v týdnu a den v měsíci!

Poznámky

  • Není možné vytvořit trigger, který by se spouštěl každé druhé pondělí v měsíci. To neumí jednoduše ani unixový Cron.
  • Podpora pro specifikování jak dnů v týdnu, tak dnů v měsíci není úplná (musíte proto nyní v jednom z těchto dvou polí používat znak '?').
  • Věnujte zvýšenou pozornost při nastavování časů, má-li být aplikace spuštěna mezi půlnocí a 1 hodinou ráno – protože posun času (na jaře a na podzim) může znamenat, že aplikace neproběhne, nebo proběhne dvakrát, podle toho, kam se čas posouvá.

Pozn.: v anglicky mluvících zemích se čas vždy posouvá mezi půlnocí a 1h ráno, kdežto u nás to, myslím, bývá mezi druhou a třetí...

Zdroj

Validátor výrazů ad.

photo credit: arbyreed via photopin cc