Hvis du nogensinde har styret en Linux-server, arbejdet med backend-udvikling eller opsat automatiserede cloud-funktioner, har du sandsynligvis stødt på en streng, der ser sådan ud: 0 2 * * *. For den uindviede ligner det en tastefejl tilbage på tastaturet. For systemadministratorer er det hjertebanken i moderne infrastrukturautomatisering: et Cron-udtryk.
Cron er den usynlige motor, der kører internettet. Det sikrer, at din database sikkerhedskopierer kl. 03.00, den udløser de e-mails, du modtager hver mandag morgen, og den rydder midlertidige serverfiler ud, før de går ned i systemet. Men på trods af dens kraft er syntaksen notorisk svær for mennesker at analysere. I dette dybe dyk vil vi afmystificere stjernerne og lære dig at læse og skrive cron-skemaer som en erfaren DevOps-ingeniør.
Hvad er Cron and the Crontab?
Cron er en tidsbaseret jobplanlægger, der findes i Unix-lignende computeroperativsystemer. Navnet "cron" kommer fra det græske ord for tid, chronos. Brugere, der opsætter og vedligeholder softwaremiljøer, bruger cron til at planlægge job (kommandoer eller shell-scripts) til at køre periodisk på faste tidspunkter, datoer eller intervaller.
Crontab (Cron Table) er konfigurationsfilen, hvor disse tidsplaner er gemt. Når du redigerer din crontab via terminalen, skriver du en liste med instruktioner, der fortæller serveren præcis, hvad den skal udføre og hvornår.
Dekonstruktion af de 5 stjerner
Et standard cron-udtryk består af 5 felter adskilt af et mellemrum. Hvert felt repræsenterer en bestemt tidsenhed, og de læses altid fra venstre mod højre i denne nøjagtige rækkefølge:
* * * * * command_to_execute
- - - - -
| | | | |
| | | | +----- Day of the Week (0 - 6) (Sunday=0 or 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the Month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)
En stjerne (*) betyder "alle mulige værdier for dette felt". Så udtrykket * * * * * oversættes bogstaveligt til: "Løb hvert minut, hver time, hver dag, hver måned, hver dag i ugen."
Syntaksmodifikatorer: Trin, intervaller og lister
Kraften ved cron kommer fra dets modifikatorer. Du er ikke begrænset til kun specifikke tal eller "alt".
1. Trinmodifikatoren (/)
Hvis du vil have et script til at køre hvert 15. minut, bruger du et trin. */15 * * * * betyder "hvert minut, der er deleligt med 15". Den kører klokken 0, 15, 30 og 45 over timen.
2. Områdemodifikatoren (-)
Hvis du kun vil have et script til at køre i åbningstiden, bruger du et interval. 0 9-17 * * * betyder "kør ved minut nul, hver time fra kl. 9.00 til kl. 17.00".
3. Listemodifikatoren (,)
Hvis du vil have noget til at køre på bestemte, ikke-sekventielle dage, så brug en liste. 0 0 1,15 * * betyder "løb ved midnat den 1. og den 15. i måneden".
Stop med at gætte Cron-udtryk
Risiker ikke at køre et backup-script hvert minut i stedet for hver måned. En enkelt tastefejl kan nedbryde en produktionsserver. Brug vores interaktive visuelle generator til at bygge og validere cron-strenge sikkert.
Åbn Cron Job GeneratorDen farligste Cron-fejl
Den mest almindelige og katastrofale fejl, som udviklere begår, er at forvirre "Minute"-feltet. Lad os se på et scenarie, hvor du vil køre et databaseoprydningsscript en gang i timen kl. 02.00.
Fejlen: * 2 * * *
Hvis du skriver ovenstående, beder du serveren om at køre scriptet "Hvert minut, i løbet af den 2. time af dagen". Dit tunge databaseoprydningsscript udløses 60 gange i træk, hvilket sandsynligvis vil overbelaste din CPU, låse databasetabeller og forårsage et massivt udfald.
Den rigtige måde: 0 2 * * *
Dette fortæller eksplicit, at serveren kun skal køre ved "minut nul, af den 2. time". Den udføres præcis én gang kl. 02.00.
Ofte stillede spørgsmål (FAQ)
Tager cron højde for tidszoner?
Som standard evaluerer cron udtryk baseret på den lokale systemtid på den server, den kører på. Hvis din server er hostet i en AWS-region i London, kører den på UTC/GMT. Du skal tage højde for tidszoneforskelle, hvis dine brugere er i New York eller Tokyo.
Kan jeg planlægge et cron-job til at køre hvert sekund?
Nej. Standard Unix cron er begrænset til en opløsning på et minut. Hvis du har brug for sub-minut planlægning (f.eks. hvert 10. sekund), skal du bruge et separat dæmon-værktøj eller skrive et script, der kører hvert minut, men som sløjfer internt med sleep-kommandoer.
Hvad betyder strenge som @daily eller @hourly?
Mange moderne implementeringer af cron understøtter ikke-standard foruddefinerede makroer for at gøre planlægning lettere. @daily er nøjagtig det samme som 0 0 * * * (midnat hver dag). @hourly er det samme som 0 * * * *. Selvom de er nyttige, understøttes de ikke universelt på tværs af alle ældre systemer.