Hur du läser ett cron-uttryck
Ett cron-uttryck är fem värden åtskilda av mellanslag, lästa från vänster till höger som minut, timme, dag i månaden, månad, veckodag. Jobbet körs när den aktuella tiden matchar varje fält.
30 4 * * 1
│ │ │ │ │
│ │ │ │ └── day of week (1 = Monday)
│ │ │ └──── month (any)
│ │ └────── day of month (any)
│ └──────── hour (4am)
└─────────── minute (30)
Det där läses som "kl. 04:30 varje måndag".
De fem fälten
| # | Fält | Tillåtna värden | Noteringar |
|---|---|---|---|
| 1 | Minut | 0 till 59 | |
| 2 | Timme | 0 till 23 | 24-timmarsklocka, 0 är midnatt |
| 3 | Dag i månaden | 1 till 31 | |
| 4 | Månad | 1 till 12, eller JAN till DEC | |
| 5 | Veckodag | 0 till 6, eller SUN till SAT | 0 är söndag, och de flesta cron-implementationer accepterar även 7 |
Vissa schemaläggare använder en annan form. Quartz, som används av mycket Java-programvara, sätter sekunder först och lägger till ett valfritt år, och numrerar sina veckodagar 1 till 7 med start på söndag. Om ett uttryck har sex eller sju fält, kontrollera vilket system det skrevs för innan du litar på din läsning av det.
Operatorerna
Det finns fyra, och de kombineras inom ett och samma fält.
| Symbol | Namn | Exempel | Betydelse |
|---|---|---|---|
* | Vilket som helst | * * * * * | Varje minut varje dag |
, | Lista | 0 9,13,17 * * * | Kl. 09:00, 13:00 och 17:00 |
- | Intervall | 0 9-17 * * * | Varje timme från 09:00 till och med 17:00 |
/ | Steg | */15 * * * * | Vid :00, :15, :30 och :45 |
Ett steg tillämpas alltid på ett intervall. */15 i minutfältet betyder "börja på 0 och ta vart 15:e värde upp till 59". Du kan också stega ett uttryckligt intervall: 5-30/10 ger 5, 15 och 25, och slutar sedan eftersom 35 ligger bortom slutet.
Steg betyder inte "var 15:e minut från och med nu"; de väljer fasta värden på klockan. */40 går igång vid :00 och :40, och väntar sedan bara 20 minuter till nästa timmes :00, eftersom räkningen börjar om varje timme. Listor kan innehålla intervall och steg, så 0 0-6/2,12,18-23 * * * är ett giltigt timfält.
Namn och genvägar
Fälten för månad och veckodag accepterar namn på tre bokstäver, och skiftläget spelar ingen roll, så JAN, jan och Jan är samma sak. Den klassiska crontab-dokumentationen säger att intervall och listor av namn inte är tillåtna, även om många moderna implementationer faktiskt accepterar MON-FRI. Om du inte är säker på vad som kör ditt jobb, använd siffror: 1-5 är entydigt överallt.
Flera genvägar ersätter hela uttrycket med fem fält:
| Genväg | Motsvarighet | Körs |
|---|---|---|
@yearly eller @annually | 0 0 1 1 * | Midnatt den 1 januari |
@monthly | 0 0 1 * * | Midnatt den 1:a i månaden |
@weekly | 0 0 * * 0 | Midnatt på söndagar |
@daily eller @midnight | 0 0 * * * | Midnatt varje dag |
@hourly | 0 * * * * | Varje heltimme |
@reboot finns också, men det är inget schema: det kör jobbet en gång när cron självt startar.
Fällan med dag i månaden och veckodag
Det är den här som bits. När både fältet för dag i månaden och fältet för veckodag är begränsade, alltså när inget av dem är *, kör cron jobbet när något av dem matchar, inte när båda gör det.
0 0 13 * 5
Du skulle kunna läsa det som "midnatt fredagen den 13:e". Det betyder i själva verket "midnatt den 13:e varje månad, och dessutom midnatt varje fredag": mer än sextio körningar om året i stället för en eller två.
Det OCH-beteende du förväntade dig gäller bara när ett av de två fälten är *. Så 0 0 * * 5 är varje fredag och 0 0 13 * * är varje 13:e, båda helt normala. Det är att begränsa båda som utlöser ELLER.
Det finns inget standardsätt att uttrycka "fredagen den 13:e" i fem fält. Den vanliga lösningen är att schemalägga varje 13:e och låta jobbet kontrollera veckodagen innan det gör något arbete.
En besläktad finess: vissa implementationer avgör om ett fält är begränsat genom att kontrollera om det bokstavligen börjar med *. Under dessa räknas 0-6 i veckodagsfältet som begränsat trots att det täcker varje dag, vilket tyst slår på ELLER-beteendet. Använd * när du menar "vilken som helst".
Misstag värda att kontrollera
* */2 * * *körs varje minut under varannan timme: 720 körningar om dagen. Du ville ha0 */2 * * *, som blir 12.- Ett saknat minutfält förskjuter allt ett steg åt vänster och tolkas oftast ändå, vilket ger dig ett giltigt schema vid helt fel tid.
0 0 31 * *hoppar tyst över de månader som inte har någon 31:a.- Cron använder systemets eller användarens tidszon om inte schemaläggaren låter dig ange en. När klockan ställs om för sommartid kanske ett jobb i den överhoppade timmen inte körs alls, och ett jobb i den upprepade timmen kan köras två gånger, beroende på implementationen. Jobb som måste köras en gång om dygnet läggs säkrast utanför de tidiga morgontimmar där omställningen hamnar.
När du är osäker, läs tillbaka uttrycket som en mening och kontrollera sedan de närmaste gångerna det faktiskt skulle gå igång. Om de datumen inte är vad du beskrev är uttrycket fel, inte din läsning av det.