Bygg ett cron-uttryck

bygg ett cron-uttryck från UI-fält eller en förinställning (varje minut, varje timme, dagligen, veckovis...)

Varför en visuell cron-byggare?

Ett cron-uttryck ryms i fem fält men är ändå en av de största buggalstrarna i produktion. Hur många gånger har en utvecklare skrivit 0 0 * * 1 i tron att det betyder "varje måndag", utan att komma ihåg att 1 kan betyda söndag beroende på implementation? Hur många gånger har man förväxlat */15 och 15? Cron-byggaren svarar på det behovet: att bygga ett crontab-uttryck visuellt, från vanliga förinställningar eller individuella fält, och få det slutgiltiga uttrycket redo att klistras in i en Linux-crontab, ett Kubernetes CronJob eller en GitHub Actions-schemaläggning.

Verktyget är motsatsen till vår cron-avkodare: där konverteraren tar ett uttryck och rullar ut nästa körningar tar byggaren mänskliga val och producerar motsvarande cron-uttryck.

Så fungerar det

Det grafiska gränssnittet erbjuder två kompletterande sammansättningslägen:

  • Förinställningsläge: en frekvensväljare (every minute, every hour, every day, every week, every month, every year, custom) som omedelbart genererar ett giltigt cron-uttryck .
  • Fältläge: fem redigerbara fält (minut, timme, dag i månad, månad, dag i vecka) där du fritt kan ange *, ett heltal, ett intervall 1-5, en lista 1,15,30 eller ett steg */15.

Byggaren uppdaterar uttrycket i realtid och visar en kortfattad mänsklig läsning ("varje dag klockan 3", "var 15:e minut") som fungerar som skyddsräcke: om meningen inte stämmer med din avsikt är uttrycket förmodligen fel.

De fem cron-fälten, tydligt

Ett vanligt cron-uttryck innehåller fem fält separerade med mellanslag:

minute  heure  jour-du-mois  mois  jour-de-la-semaine
*       *      *             *     *
  • minut (0 till 59);
  • timme (0 till 23);
  • dag i månaden (1 till 31);
  • månad (1 till 12 eller förkortningar Jan, Feb osv.);
  • veckodag (0 till 7, där 0 och 7 båda betyder söndag i de flesta implementationer).

Varje fält accepterar flera former: * (alla värden), ett specifikt heltal (5), en lista (1,3,5), ett intervall (9-17), ett steg (*/15 var 15:e värde) eller en kombination (0-30/5).

Typiska användningsfall

  • Utvecklare som lär sig cron: visualisera hur varje fält interagerar utan att riskera ett felaktigt uttryck i produktion.
  • Stressad systemadministratör: generera på några sekunder ett schema för en Linux-cron, ett Kubernetes CronJob eller ett Ansible-jobb utan att läsa om man-sidan.
  • Utvecklare utan POSIX-erfarenhet: producera ett giltigt crontab-uttryck för Symfony Scheduler, Laravel Scheduler eller node-cron utan att kunna den historiska syntaxen.
  • DevOps i granskning: snabbt prototypa ett uttryck att föreslå i en pull request och sedan validera det med cron-avkodaren.
  • Legacy-migration: omformulera ett historiskt cron-uttryck genom byggaren för att säkerställa semantiken innan det skickas vidare.

Vanliga förinställningar

Att välja en förinställning skriver över de enskilda fälten och producerar motsvarande uttryck:

  • Varje minut: * * * * *. Undvik i produktion utom vid särskilt behov.
  • Varje timme: 0 * * * *. Vid varje timmes början.
  • Varje dag: 0 0 * * *. Vid midnatt.
  • Varje vecka: 0 0 * * 0. Varje söndag vid midnatt.
  • Varje månad: 0 0 1 * *. Den 1:a varje månad vid midnatt.
  • Varje år: 0 0 1 1 *. Den 1 januari vid midnatt.

Vanliga mönster att känna till

Uttryck Mänsklig läsning
0 0 * * * Varje dag vid midnatt
*/15 * * * * Var 15:e minut
0 9 * * 1-5 Varje vardag klockan 9
0 0 1 * * Den 1:a varje månad vid midnatt
0 0 * * 0 Varje söndag vid midnatt
*/5 9-17 * * 1-5 Var 5:e minut under arbetstid
0 3 * * * Varje dag klockan 3 på morgonen
30 2 1,15 * * Den 1:a och 15:e varje månad klockan 2:30

Bygga ett anpassat uttryck

För mer specifika fall exponerar assistenten de fem fälten för fri inmatning. Några användbara exempel:

  • Varje dag klockan 3 på morgonen: minut=0, timme=3, övriga fält *.
  • Var 15:e minut: minut=*/15, övriga fält *.
  • Måndag till fredag klockan 9: minut=0, timme=9, veckodag=1-5.
  • Den 1:a och 15:e varje månad klockan 12: minut=0, timme=12, dag-i-månaden=1,15.
  • Var 5:e minut mellan kl. 9 och 17: minut=*/5, timme=9-17.

Så använder du cron-byggaren

  1. Välj en förinställning (every minute, every hour, every day, every week, every month, every year) som motsvarar grunden för ditt behov.
  2. Förfina vid behov genom att redigera de fem fälten direkt (minut, timme, dag i månad, månad, dag i vecka).
  3. Läs den mänskliga meningen som verktyget genererat för att bekräfta avsikten.
  4. Kopiera det producerade cron-uttrycket via kopieringsknappen.
  5. Validera schemat med vår cron-avkodare som räknar ut de nästa faktiska körningstiderna.
  6. Klistra in uttrycket i din Linux-crontab, ditt Kubernetes CronJob, din Symfony Scheduler eller ditt GitHub Actions-arbetsflöde.

Klassiska fallgropar

  • Dag i månad och veckodag kombinerade: om båda inte är * varierar beteendet mellan implementationer. Linux/Vixie cron tillämpar ett ELLER; moderna bibliotek har ibland ett annat beteende. Undvik.
  • Dag 1 = måndag eller söndag?: beror på land och konvention. De flesta Unix-cron betraktar söndag=0 och lördag=6. Kontrollera din schemaläggare.
  • Tidszon: en Unix-cron använder som standard serverns tidszon. Applikations- schemaläggare (Symfony Scheduler, Quartz) tillåter ofta att fixera en dedikerad tidszon.
  • Saknad minut: * * * * * kör jobbet varje minut, vilket sällan är vad man vill. Tänk på att ange en specifik trigger (0) för timbaserade uppgifter.

Mänsklig läsning och utdata

Utöver cron-uttrycket erbjuder verktyget en kortfattad mänsklig läsning ("varje dag vid midnatt", "var 5:e minut"). Det är ett skyddsräcke: om meningen inte motsvarar din avsikt är uttrycket förmodligen fel. För ett komplext fall, använd sedan vår cron-avkodare för att räkna ut de nästa faktiska körningstiderna.

Vanliga frågor

Kan jag redigera uttrycket manuellt efter att ha använt gränssnittet?

Ja. Byggaren är inte ett exklusivt läge: de fem fälten förblir redigerbara när som helst. Du kan utgå från en förinställning och sedan justera ett fält för hand för att få ett skräddarsytt crontab-uttryck. Den mänskliga läsningen räknas om omedelbart.

Stöder verktyget Quartz-formatet med 6 fält (med sekunder)?

Nej: formatet med 5 fält är Unix-standarden och den gemensamma grunden för de flesta schemaläggare (Linux crontab, Kubernetes CronJob, GitHub Actions, GitLab CI, Symfony Scheduler, Laravel Scheduler). Quartz (Java) accepterar ett extra fält för sekunder och specifika symboler (?, L, W, #), men behovet är sällsynt.

Hur hanteras tidszonen?

Byggaren producerar ett neutralt cron-uttryck: det är motorn som kör jobbet som tillämpar sin tidszon. På en Linux-crontab är det serverns TZ. På GitHub Actions är det UTC. På Kubernetes 1.27+ kan du sätta spec.timeZone i manifestet. Symfony Scheduler och Quartz exponerar en dedikerad tidszon per uppgift.

Hur validerar jag mitt uttryck utan att köra det i produktion?

Använd vår cron-avkodare. Den räknar ut de N nästa körningarna från den aktuella tidpunkten, utan att starta något jobb. Det är det bästa sättet att bekräfta att ett cron-uttryck verkligen triggar vid den planerade tiden innan du driftsätter det.

Vad är relationen till Symfony Scheduler?

Symfony Scheduler accepterar cron-uttryck med 5 fält via Schedule::cron('0 3 * * *', ...) . Det uttryck byggaren producerar kan därför klistras in som det är. Detsamma gäller Laravel Scheduler (->cron('...')), node-cron, Hangfire och Airflow.

Måste man prefixa kommandot i systemets crontab?

Ja, i /etc/crontab behövs en användare (0 3 * * * www-data /usr/bin/php ...), medan crontab -e per användare utelämnar den. Själva uttrycket är identiskt.

Exempelförfrågan

curl -X POST https://cdrn.fr/api/v1/tools/cron-builder/execute \
  -H "Content-Type: application/json" \
  -d '{"preset":"none","minute":"*","hour":"*","day_of_month":"*","month":"*","day_of_week":"*"}'

Indatasschema

Fält Typ Obligatorisk Standard
preset choice (none, every_minute, hourly, daily, weekly, monthly, yearly) none
minute string *
hour string *
day_of_month string *
month string *
day_of_week string *

Slutpunkter

  • GET https://cdrn.fr/api/v1/tools - listar alla tillgängliga verktyg
  • GET https://cdrn.fr/api/v1/tools/cron-builder - hämtar schemat för detta verktyg
  • POST https://cdrn.fr/api/v1/tools/cron-builder/execute - kör detta verktyg med en JSON-payload