Výraz cron je pět polí oddělených mezerami, čtených zleva doprava: minuta, hodina, den v měsíci, měsíc, den v týdnu. 0 5 * * * znamená „v minutě 0 hodiny 5, každý den“ - tedy v pět ráno. */15 * * * * znamená „každou patnáctou minutu, každé hodiny, každý den“. Tím je vyřízeno devadesát procent a pokud jsi potřeboval jen noční restart, můžeš tady přestat číst.
Zbylých deset procent je místo, kde lidé ztratí víkend: pole dne v měsíci a dne v týdnu se při použití obou nechovají tak, jak čekáš, */7 nedělá to, co vypadá, časové pásmo není to, ve kterém sedíš, a úloha s šedesátisekundovým zpožděním po záloze nečeká, až záloha skončí. Tento článek pořádně vysvětluje syntaxi a pak hrstku plánů, které stojí za to na herním serveru provozovat.
Pět polí#
| Pozice | Pole | Rozsah | Přijímá také |
|---|---|---|---|
| 1 | Minuta | 0-59 | |
| 2 | Hodina | 0-23 | 24hodinové hodiny, bez AM/PM |
| 3 | Den v měsíci | 1-31 | |
| 4 | Měsíc | 1-12 | JAN-DEC |
| 5 | Den v týdnu | 0-7 | SUN-SAT; 0 i 7 jsou neděle |
Každé pole musí být přítomné. Ve standardním pětipolním tvaru není pole pro sekundy ani pro rok, takže nejjemnější rozlišení je jedna minuta. Pokud plánovač před tebou žádá šest polí, jde buď o systémový crontab v /etc/crontab nebo /etc/cron.d, kde šestý sloupec je uživatel, pod kterým se úloha spustí, nebo o parser ve stylu Quartz, kde první pole jsou sekundy. To jsou různé formáty, které na první pohled vypadají stejně, a vložení výrazu z jednoho do druhého je častý způsob, jak úlohu spouštět šedesátkrát častěji, než bylo zamýšleno.
Názvy nerozlišují velikost písmen, takže MON, Mon a mon jsou totéž. Rozsahy názvů fungují ve většině implementací - MON-FRI je platné - ale kroky kombinované s názvy nejsou přenositelné, takže pokud si chceš být jistý, piš 1-5 místo MON-FRI/2.
Čtyři operátory, a to je všechno#
- **
*- každá hodnota.*** * * * *běží jednou za minutu, navždy. Je to skvělý způsob testování a hrozná věc, kterou tam nechat. - `,` - seznam.
0,30 * * * *je celá a půl hodiny. Seznamy mohou obsahovat rozsahy:0 2,6,14,22 * * *. - `-` - rozsah, včetně krajních hodnot.
0 9-17 * * *je každá hodina od 09:00 do 17:00, což je devět spuštění, ne osm. - `/` - krok.
*/15v poli minut je 0, 15, 30, 45. Krok se vztahuje na to, co je vlevo od něj, takže0-30/10je 0, 10, 20, 30 a5/10v poli minut znamená „začni na 5 a krokuj po 10 do konce rozsahu“: 5, 15, 25, 35, 45, 55.
Některé parsery přijímají i zkratky místo všech pěti polí: @hourly, @daily (též @midnight), @weekly, @monthly, @yearly a @reboot. V crontabu na Linuxu jsou pohodlné a v polích panelů nespolehlivé, protože mnohé chtějí pět skutečných polí. Výraz vypiš celý; je o pět znaků delší a funguje všude.
Neexistuje operátor pro „poslední den v měsíci“, „první čtvrtek“ ani „každý druhý týden“. Parsery ve stylu Quartz přidávají na část toho L, W a #, standardní cron ne, a pole v panelu bývá standardní. Obejití je níže.
Vyřešené příklady#
| Výraz | Kdy se spustí |
|---|---|
0 5 * * * | 05:00 každý den |
45 4 * * * | 04:45 každý den |
*/15 * * * * | Každých 15 minut |
0 */6 * * * | 00:00, 06:00, 12:00, 18:00 |
0 5 * * 1 | 05:00 každé pondělí |
30 3 * * 0 | 03:30 každou neděli |
0 4 1 * * | 04:00 prvního dne v měsíci |
0 4 1,15 * * | 04:00 prvního a patnáctého |
*/10 9-17 * * 1-5 | Každých 10 minut, 09:00-17:50, ve všední dny |
0 3 * * 4 | 03:00 každý čtvrtek |
17 2 * * * | 02:17 každý den |
Ten poslední není překlep. O půlnoci a na začátku celé hodiny běží zálohy, rotace logů a kontroly aktualizací všech ostatních a na sdíleném hardwaru je to měřitelná špička. Zvolit zvláštní minutu nestojí nic a zařadí tvoji úlohu na klidnější místo.
Neznámý výraz čti tak, že projdeš pole po řadě a mezi nimi řekneš slovo „z“. 30 3 * * 0 je „minuta 30, z hodiny 3, z libovolného dne v měsíci, z libovolného měsíce, v neděli“. Tenhle návyk zachytí většinu chyb dřív, než se spustí.
Past dne v měsíci a dne v týdnu#
Je to nejčastěji špatně chápané pravidlo cronu a stálo víc náhodných smazání než cokoli jiného.
Pokud jsou obě pole, den v měsíci i den v týdnu, omezená - žádné není * - cron spustí úlohu, když platí kterékoli z nich, ne když obě. 0 0 13 * 5 neznamená „o půlnoci v pátek třináctého“. Znamená „o půlnoci každého třináctého a také o půlnoci každý pátek“, což je zhruba devětkrát za měsíc, ne jednou nebo dvakrát za rok.
Když je jedno z obou *, chování je běžné, jaké čekáš: 0 4 * * 1 je jen pondělí, 0 4 15 * * jen patnáctého.
Takže: abys řekl „první čtvrtek v měsíci“, samotným cronem to nejde. Na stroji s Linuxem to naplánuješ na každý čtvrtek a v příkazu to ohlídáš:
# 06:00 on the first Thursday of the month. Note the escaped % in a crontab.0 6 * * 4 [ "$(date +\%d)" -le 07 ] && /opt/scripts/wipe.sh >> /var/log/wipe.log 2>&1V panelu jen s polem cronu a seznamem příkazů je upřímná odpověď, že to spustíš ručně, nebo to pustíš každý čtvrtek a smíříš se s tím, nebo to každý měsíc naplánuješ jako jednorázovou úlohu. Vynucený wipe v Rustu je obvyklý důvod, proč se lidé ptají, a wipy bez ztráty hráčů tvrdí, že oznámení stejně znamená víc než automatizace.
Časová pásma, změny času a co znamená „půlnoc“#
Cron nemá vlastní časové pásmo. Používá hodiny toho, co ho spouští, tedy místní čas stroje na Linuxu a nastavené časové pásmo panelu v hostingovém panelu. Ani jedno nemusí být tvoje. Hráč v Tbilisi, který naplánuje restart na 0 5 * * * na hardwaru v Německu, ho naplánoval na 08:00 svého času v zimě a 07:00 v létě, což není pro nikoho uprostřed večera a pro něj je to uprostřed rána.
Z toho plynou dvě věci.
Zjisti, na kterých hodinách jsi, než plánu uvěříš. Nejrychlejší test je nastavit neškodnou úlohu - oznámení ve hře nebo echo na Linuxu - dvě minuty dopředu a sledovat, jestli se spustí, kdy čekáš. Udělej to jednou na každém hostiteli; je to rychlejší než číst čí dokumentaci.
Vyhni se hodinám, kdy se čas posouvá. V EU, včetně německého hardwaru, na kterém běžíme, hodiny skočí dopředu ve 02:00 místního času poslední neděli v březnu a zpět ve 03:00 místního času poslední neděli v říjnu. Při skoku dopředu hodina od 02:00 do 02:59 neexistuje a při skoku zpět nastane dvakrát. Různé implementace cronu to řeší různě - některé přeskočí, některé spustí pozdě, některé dvakrát - a o žádné se nevyplatí hádat. Naplánuj údržbu na 04:00 nebo 05:00 a otázka nikdy nevznikne. Pokud opravdu potřebuješ přesné intervaly přes změnu času, provozuj stroj i plán na UTC.
Plány, které na herním serveru stojí za to mít#
Čtyři plány předejdou většině toho, kvůli čemu lidé otevírají tikety. Časy níže předpokládají, že v pět ráno nikdo nehraje; posuň blok, zachovej pořadí.
| Výraz | Úloha | Proč |
|---|---|---|
40 4 * * * | Oznámit restart za 20 minut | Nikdo neztratí stavbu |
50 4 * * * | Příkaz save, pak záloha | Záloha obsahuje posledních deset minut |
0 5 * * * | Restart | Vyčistí úniky, entity, fragmentaci |
0 4 * * 0 | Týdenní záloha, uchovaná a zamčená | Ta, ze které obnovuješ po špatném týdnu |
Příkaz save před zálohou je krok, který lidé přeskakují. Záloha je kopie souborů na disku a většina herních serverů drží svět v paměti a zapisuje ho podle časovače. Záloha bez předchozího uložení ti dá archiv toho, jak svět vypadal při posledním automatickém uložení, což mohlo být před pětadvaceti minutami. Pošli save-all v Minecraftu, save v konzoli Valheimu, saveworld nebo ekvivalent v čemkoli, co provozuješ, počkej minutu a pak udělej zálohu.
Kromě těchto čtyř přidej, co tvoje hra potřebuje: výpis databáze na vlastním plánu, pokud nějakou provozuješ (zálohy a obnovy databází), polední uložení s oznámením na serveru, kde se staví, rotaci logů, pokud hra zapisuje vlastní logy (logy, které stojí za uchování). Plánované úlohy, které stojí za to mít je krátká verze tohoto seznamu a plány restartů, které pomáhají řeší, jak často je příliš často.
Řazení úloh, zpoždění a překrývající se běhy#
Plán v panelu je obvykle jeden výraz cron s několika úlohami pod sebou, každá se zpožděním v sekundách od předchozí. To zpoždění je čekání, ne kontrola dokončení. Záleží na tom víc, než se zdá:
- Úloha jedna: poslat
save-all. Zpoždění 60 sekund. - Úloha dvě: vytvořit zálohu. Zpoždění 60 sekund.
- Úloha tři: restartovat server.
Vypadá to správně a není. Záloha serveru o 30 GB trvá minuty a restart se spustí šedesát sekund poté, co záloha začala, ne poté, co skončila. Dostaneš restart uprostřed archivace a archiv, který může a nemusí být použitelný. Oprava je dát záloze prostor - několik minut zpoždění podle velikosti světa - nebo lépe dát restart na samostatný plán 0 5 * * *, zatímco záloha běží v 50 4 * * *. Dva plány s odstupem deseti minut se posuzují snáz než jeden plán s odhadnutým zpožděním.
V crontabu na Linuxu je ekvivalentním problémem úloha, která trvá déle než její interval. */5 * * * * na skriptu, který někdy běží sedm minut, dá dvě kopie bojující o stejné soubory. Obal to:
*/5 * * * * flock -n /tmp/sync.lock /opt/scripts/sync.sh >> /var/log/sync.log 2>&1flock -n zámek získá, nebo se okamžitě vzdá, takže druhá kopie skončí místo spuštění. Je to jedno slovo a odstraní celou kategorii incidentů.
Karta Schedules na RE:NODE přijímá výraz cron a seznam seřazených úloh se zpožděními a úloha je jedna ze tří věcí: příkaz konzole, záloha nebo akce napájení. Sloty záloh jsou na každém tarifu, zálohu lze zamknout, aby ji rotace nesmazala, a kopie se ukládají mimo stroj, který chrání. To pokrývá celou tabulku výše bez jediného skriptu. Průvodce plány má verzi klik po kliku a jak panel funguje uvnitř vysvětluje, proč plánovač žije v panelu, a ne uvnitř tvého serveru.
Crontab na Linuxu: další pravidla#
Pokud jsi na VDS, ne v panelu, má cron několik chování, která nemají s výrazem nic společného a úlohy přesto rozbíjejí.
- Edituj přes `crontab -e`, vypiš přes `crontab -l`. Ruční úprava souborů ve spoolu je způsob, jak skončit s crontabem, který se tiše nenačte.
- `PATH` je téměř prázdná. Cron nečte profil tvého shellu.
node,dockera cokoli v/usr/local/binnemusí být nalezeno. Používej v příkazu absolutní cesty, nebo nastavPATH=na začátku crontabu. - `%` znamená nový řádek. V příkazu crontabu se neescapované
%změní na zalomení řádku a vše po prvním se předá úloze na standardní vstup.date +%Yse stanedate +plus zbloudilým řádkem. Každé escapuj jako\%. - Výstup se posílá poštou, nelogguje se. Pokud není poštovní systém, výstup nikam nejde. Přesměruj si ho sám přes
>> /var/log/job.log 2>&1a pokud chceš ticho, nastavMAILTO=""na začátku crontabu. - Systémové crontaby mají pole uživatele. Soubory v
/etc/cron.da/etc/crontabmají šest sloupců, s uživatelem mezi polem dne v týdnu a příkazem. Pětisloupcový řádek v nich selže.
Pro cokoli se skutečným řetězcem závislostí jsou časovače systemd lepší než cron: logují do žurnálu, mohou záviset na jiných jednotkách a systemctl list-timers ti řekne, kdy je další běh - což cron nikdy neřekne. Pro práci spouštěnou aplikací, ne hodinami, chceš místo toho frontu: úlohy na pozadí na malém serveru.
Chyby, které lidi stály víkend#
***/7 * * * * není každých sedm minut.** Kroky se na začátku každé hodiny restartují, takže se spustí v minutě 0, 7, 14, 21, 28, 35, 42, 49, 56 a pak znovu v 0 o čtyři minuty později. Každý krok, který nedělí 60, má každou hodinu krátkou mezeru. Používej 5, 10, 15, 20 nebo 30.
**0 0 * * * na sdíleném stroji.** Půlnoc je nejvytíženější minuta dne na každém uzlu. Posuň to.
Restartovat častěji, než je třeba. Restart každých šest hodin na serveru, který je týden v pořádku, jsou čtyři přerušení denně koupená za nic. Restartuj na základě důkazů, ne pověr - proč se váš herní server pořád restartuje popisuje, jak rozeznat únik od běžného růstu.
Plán záloh, ze kterého nikdo nikdy neobnovoval. Záloha, kterou jsi nikdy neobnovil, je hypotéza. Vyber klidný týden a vyzkoušej obnovu dřív, než ji budeš potřebovat.
Zapomenout, že plán existuje. Za půl roku úloha pořád vyprazdňuje adresář, který teď obsahuje něco jiného. Zapiš záměr do názvu plánu a jednou za sezonu si přečti seznam plánů.
FAQ#
Co znamená */15 * * * *?
Každou patnáctou minutu každé hodiny: 00, 15, 30 a 45. */15 je krok v poli minut; zbývající čtyři hvězdičky znamenají, že není omezeno na žádnou konkrétní hodinu, datum, měsíc ani den v týdnu.
Proč moje úloha cron běží dvakrát, nebo ve špatný čas?
Dvě obvyklé příčiny jsou pravidlo dne v měsíci a dne v týdnu - pokud jsou nastavena obě pole, cron se spustí, když platí kterékoli - a časové pásmo, které je hostitele nebo panelu, ne tvoje. Než usoudíš, že plánovač je rozbitý, zkontroluj obojí.
Může cron spustit něco každých 30 sekund?
Sám ne; jedna minuta je nejjemnější interval. Spouštěj úlohu každou minutu a nech ji uvnitř 30 sekund počkat a zopakovat se, nebo použij časovač systemd s OnUnitActiveSec=30s, nebo dej smyčku do programu, který ji potřebuje.
Má být první záloha, nebo restart?
Nejdřív záloha, s příkazem save před ní, a restart o pohodlný rozestup později. Záloha pořízená při vypínání je záloha serveru, který se vypíná, a záloha spuštěná šedesát sekund před restartem nemusí být dokončena.
Musím po úpravě crontabu něco restartovat?
Ne. Cron znovu načte soubor poté, co ho crontab -e uloží. V panelu plán začne platit hned po uložení a nejbezpečnější ověření je jednou ho nastavit o pár minut dopředu a sledovat, jak se spustí.
Jaké časové pásmo používají plány v panelu?
To, pro které je panel nastaven, což bývá umístění hardwaru, ne tvoje. Náš běží v Německu, takže tamní místní čas se mezi létem a zimou posouvá o hodinu. Než na tom postavíš okno údržby, otestuj to neškodnou úlohou.




Komentáře
Zcela anonymně: žádný účet, žádný e-mail, žádné cookie. Ukládáme jen jméno, které napíšeš, text a čas - nic dalšího. Počet odkazů je omezený a značkování se nevykresluje.