Om du någonsin har hanterat en Linux-server, arbetat med backend-utveckling eller ställt in automatiserade molnfunktioner, har du förmodligen stött på en sträng som ser ut ungefär så här: 0 2 * * *. För den oinvigde ser det ut som ett stavfel kvar på tangentbordet. För systemadministratörer är det hjärtslag i modern infrastrukturautomatisering: ett Cron-uttryck.
Cron är den osynliga motorn som driver internet. Det säkerställer att din databas säkerhetskopieras klockan 03:00, den utlöser e-postmeddelanden du får varje måndag morgon och den rensar ut temporära serverfiler innan de kraschar systemet. Men trots sin kraft är syntaxen notoriskt svår för människor att analysera. I denna djupdykning kommer vi att avmystifiera asteriskerna och lära dig hur du läser och skriver cron-scheman som en erfaren DevOps-ingenjör.
Vad är Cron and the Crontab?
Cron är en tidsbaserad jobbschemaläggare som finns i Unix-liknande datoroperativsystem. Namnet "cron" kommer från det grekiska ordet för tid, chronos. Användare som konfigurerar och underhåller mjukvarumiljöer använder cron för att schemalägga jobb (kommandon eller skalskript) för att köras regelbundet vid fasta tider, datum eller intervall.
Crontab (Cron Table) är konfigurationsfilen där dessa scheman lagras. När du redigerar din crontab via terminalen, skriver du en lista med instruktioner som talar om för servern exakt vad den ska köra och när.
Dekonstruerar de 5 asteriskerna
Ett standard cron-uttryck består av 5 fält åtskilda av blanksteg. Varje fält representerar en specifik tidsenhet, och de läses alltid från vänster till höger i exakt denna ordning:
* * * * * 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 asterisk (*) betyder "alla möjliga värden för detta fält". Så uttrycket * * * * * översätts bokstavligen till: "Kör varje minut, varje timme, varje dag, varje månad, varje dag i veckan."
Syntaxmodifierare: steg, intervall och listor
Kraften hos cron kommer från dess modifierare. Du är inte begränsad till bara specifika nummer eller "allt".
1. Stegmodifieraren (/)
Om du vill att ett skript ska köras var 15:e minut använder du ett steg. */15 * * * * betyder "varje minut som är delbar med 15". Den kommer att köras vid 0, 15, 30 och 45 över timmen.
2. Områdesmodifieraren (-)
Om du bara vill att ett skript ska köras under kontorstid använder du ett intervall. 0 9-17 * * * betyder "kör på minut noll, varje timme från 9:00 till 17:00".
3. Listmodifieraren (,)
Om du vill att något ska köras på specifika, icke-sekventiella dagar, använd en lista. 0 0 1,15 * * betyder "kör vid midnatt den 1:a och 15:e i månaden".
Sluta gissa Cron Expressions
Riskera inte att köra ett säkerhetskopieringsskript varje minut istället för varje månad. Ett enda stavfel kan krascha en produktionsserver. Använd vår interaktiva visuella generator för att bygga och validera cron-strängar på ett säkert sätt.
Öppna Cron Job GeneratorDet farligaste Cron-misstaget
Det vanligaste och mest katastrofala misstaget utvecklare gör är att blanda ihop "Minute"-fältet. Låt oss titta på ett scenario där du vill köra ett databasrensningsskript en gång i timmen klockan 02.00.
Mistaget: * 2 * * *
Om du skriver ovanstående säger du åt servern att köra skriptet "Varje minut, under den andra timmen på dagen". Ditt tunga databasrensningsskript kommer att utlösas 60 gånger i rad, vilket sannolikt överbelasta din CPU, låser databastabeller och orsakar ett massivt avbrott.
Rätt sätt: 0 2 * * *
Detta säger uttryckligen till servern att endast köras vid "Minut noll, av den andra timmen". Det kommer att köras exakt en gång klockan 02:00.
Vanliga frågor (FAQ)
Står cron för tidszoner?
Som standard utvärderar cron uttryck baserat på den lokala systemtiden för servern den körs på. Om din server är värd i en AWS-region i London, kör den på UTC/GMT. Du måste ta hänsyn till tidszonsskillnader om dina användare är i New York eller Tokyo.
Kan jag schemalägga ett cron-jobb så att det körs varje sekund?
Nej. Standard Unix cron är begränsad till en upplösning på en minut. Om du behöver schemalägga underminut (t.ex. var tionde sekund), måste du använda ett separat demonverktyg, eller skriva ett skript som körs varje minut men loopar internt med vilokommandon.
Vad betyder strängar som @dagligen eller @timme?
Många moderna implementeringar av cron stöder icke-standardiserade fördefinierade makron för att göra schemaläggning enklare. @daily är exakt samma som 0 0 * * * (midnatt varje dag). @hourly är samma som 0 * * * *. Även om de är användbara stöds de inte universellt i alla äldre system.