Deutsch

Entwicklertools · Crontab-Generator

Tag des Monats vs. Wochentag in Cron: die ODER-Regel, die alle überrascht

· Wie es funktioniert

Cron Kalender Planung

Zwei Kalenderfilter, die über ein ODER-Gatter zu einem Zeitplan zusammengeführt werden
Original-ToolAcre-Vektorillustration

Wenn beide Tagesfelder eingeschränkt sind, führt Cron den Job aus, wenn eines davon übereinstimmt. In diesem Beitrag wird die Regel von crontab(5) erläutert, warum sie existiert und wie man die Zeitpläne erhält, die sie verhindert.

Der Bericht wurde am 1. und an jedem Montag ausgeführt – der Ausdruck 0 9 1 * 1 bedeutet nicht, wie er aussieht

Ein Ausdruck wie `0 9 1 * 1` sieht wie „09:00 am ersten Montag“ aus, wenn die beiden Tagesspalten als kumulative Filter gelesen werden. ToolAcre liest das nicht so. Wenn der Tag des Monats auf 1 und der Wochentag auf Montag festgelegt sind, warnt der Parser, dass beide Bedingungen zutreffen können, sodass der Zeitplan jeden ersten und jeden Montag umfasst.

Dies ist keine geringfügige Formulierungspräferenz. Ein monatlicher Bericht kann vier oder fünf zusätzliche Male ausgeführt werden, und ein Vorgang, der nur montags erwartet wird, kann auch am Ersten eines Monats ausgeführt werden. Der Generator fügt neben der Beschreibung die Warnung „Überprüfenswert“ ein, damit das erweiterte Verhalten sichtbar ist, bevor ein Ausdruck in eine externe Crontab kopiert wird.

Die Regel wie geschrieben – wenn sowohl der Monatstag als auch der Wochentag eingeschränkt sind, wird der Befehl ausgeführt, wenn eines der Felder übereinstimmt

Die Funktion `dayMatches` der Implementierung behandelt vier Fälle explizit. Für jedes Datum sind zwei Platzhalter zulässig. ein Platzhalter für den Tag des Monats verschiebt sich auf den Wochentag; ein Platzhalter-Wochentag verschiebt sich auf den Tag des Monats; und zwei eingeschränkte Felder geben das logische ODER ihrer Übereinstimmungen zurück. Die Tests decken ein Datum ab, das nur mit dem dreizehnten, nur dem Freitag und keiner der beiden Bedingungen übereinstimmt.

Beschreibungen behalten die gleiche Regel bei. `0 0 13 * 5` wird mit „am 13. des Monats oder am Freitag“ wiedergegeben, keine mehrdeutige Konjunktion. Parsing, Next-Run-Auswahl und englische Ausgabe verwenden alle dieselbe Interpretation. Dieses gemeinsame Verhalten ist ein stärkerer Beweis als eine isolierte Hilfebezeichnung, da Unstimmigkeiten zwischen diesen Pfaden sofort zu irreführenden Vorschauen führen würden.

Der Parser implementiert OR und legt die Konsequenz offen; es legt nicht die Geschichte der Regel fest

Die Gliederung der Arbeitsmappe lieferte einen historischen Grund für das OP-Design, aber dieses Repository beweist eher Verhalten als Herkunft. Die Codekommentare identifizieren eine Regel im Vixie-Stil und die Tests ermitteln das von ToolAcre modellierte Ergebnis. Sie dokumentieren nicht, wer die Regel gewählt hat, wann sie angenommen wurde oder warum eine freizügige Auslegung bevorzugt wurde.

Beim technischen Schreiben ist es wichtig, diese Grenzen einzuhalten. Leser müssen genau wissen, wie dieses Tool den Ausdruck erweitert; Sie brauchen kein erfundenes Standard-Narrativ, um es sicher nutzen zu können. Wenn ein Bereitstellungsziel eine andere Tagessemantik dokumentiert, ist sein eigenes Handbuch dieser Browservorschau überlegen. ToolAcre gibt den Dialekt an, den es berechnet, anstatt zu behaupten, dass alle Planer damit einverstanden sind.

Arbeitsbeispiel: Auflisten von 0 9 1 * 1 für einen Monat – die Tage, an denen es ausgelöst wird, verglichen mit dem vom Autor gewünschten Zeitplan

Betrachten Sie einen Monat, dessen erster Tag nicht Montag ist. `0 9 1 * 1` erzeugt einen Lauf beim ersten und weitere Läufe jeden Montag. Wenn das erste selbst Montag ist, erscheint dieses Datum immer noch einmal, da die nächste Suche eine Kalenderminute und nicht zwei separate Auslöser berücksichtigt. Die Größe der Vereinigung ändert sich mit dem Kalender, nicht jedoch die Logik.

Sie können diese Vereinigung überprüfen, indem Sie eine Zeitzone auswählen und die nächsten fünf Läufe lesen. Die Vorschau beginnt ausschließlich nach dem aktuellen Zeitpunkt und durchsucht Kalenderdaten unter Anwendung der Monats-, Tages- und Zeitfelder. In der Artikelprosa wird kein bestimmter Monat versprochen, da die Live-Liste davon abhängt, wann und wo der Leser die Überprüfung durchführt.

Problemumgehungen für Befehle im AND-Stil am ersten Montag liegen außerhalb dieses Zeitplangenerators

Der Plan sah vor, einen Shell-Datumstest einzubetten, um UND-Verhalten zu erhalten. ToolAcre kann einen solchen Befehl nicht überprüfen: Es akzeptiert nur die fünf Zeitplanfelder und die kopierte vollständige Zeile enthält eine ausführbare Platzhalterdatei. Shell-Syntax, Prozent-Escape, Befehlsverfügbarkeit und Exit-Verhalten gehören alle zur Umgebung, in der der Job schließlich ausgeführt wird.

Innerhalb dieses Generators besteht der sichere Entwurfsschritt darin, ein Tagesfeld als `*` zu belassen, es sei denn, die ODER-Verknüpfung ist tatsächlich vorgesehen. Dokumentieren Sie für eine Anforderung am ersten Montag, dass ein Fünf-Felder-Cron allein die Schnittmenge in diesem Dialekt nicht ausdrückt. Wählen Sie eine umgebungsspezifische Lösung aus und testen Sie sie separat, anstatt als Garantie ein nicht ausgeführtes Snippet darzustellen.

Andere Scheduler-Operatoren werden von diesem Fünf-Felder-Parser nicht interpretiert

Einige Scheduler-Grammatiken stellen Operatoren wie `#`, `L`, `W` oder `?` zur Verfügung, aber dieser Parser akzeptiert keinen davon. Außerdem lehnt es sechs Felder ab und erklärt, dass sein Vertrag eine Crontab-Syntax mit fünf Feldern sei. Daher kann ein Ausdruck, der in einem anderen Produkt funktioniert, hier nicht als Beweis dafür eingefügt werden, dass dieselbe Kalenderregel existiert.

Die Dialektübersetzung beginnt mit der Identifizierung der Quell- und Zielgrammatik und nicht mit dem Löschen von Satzzeichen, bis die Validierung erfolgreich ist. ToolAcre kann dabei helfen, die fünf gewöhnlichen Felder, Namen, Bereiche, Listen und Schritte des Ziels zu erstellen. Die Semantik eines nicht unterstützten Operators kann nicht erhalten bleiben, und in den Artikeln wird bewusst darauf verzichtet, diese fremden Operatoren so zu beschreiben, als ob sie implementiert wären.

Das Befehls-Escape liegt außerhalb der Nur-Ausdruck-Grammatik

Prozentzeichen und Befehlsanführungszeichen erscheinen nach dem Zeitplan und liegen außerhalb von `parseCron`. Der Parser teilt einen Ausdruck in genau fünf durch Leerzeichen getrennte Teile auf; Es liest niemals eine Shell-Pipeline, einen Datumsbefehl oder eine Escape-Befehlsnutzlast. Daher wird in diesem Artikel keine Problemumgehung mit Prozentzeichen beschrieben, obwohl in der Arbeitsmappe eine solche vorgeschlagen wurde.

Diese Auslassung ist eine Richtigkeitsentscheidung. Ein Zeitplantool sollte nicht implizieren, dass ein Befehl sicher ist, weil seine Zeitfelder validiert sind. Überprüfen Sie die Befehlssyntax in der tatsächlichen Cron-Implementierung und Shell mit harmlosen Eingaben und beobachtbaren Ausgaben. Beschränken Sie das Ergebnis des Generators auf die Kalenderregel, die er nachweislich versteht.

Takeaway: Beschränken Sie ein Tagesfeld, nicht beide – und die Erklärung des Generators macht das ODER sichtbar, bevor Sie die Zeile speichern

Wenn beide Tagesfelder eingeschränkt sind, lesen Sie sie als Vereinigung und sagen Sie „oder“ laut. Besser noch: Überprüfen Sie die Warnung des Generators und die bevorstehenden Läufe. Wenn diese Daten den vorgesehenen Satz überschreiten, geben Sie ein Feld an `*` zurück und lösen Sie alle spezielleren Anforderungen mit einem von der Zielumgebung dokumentierten Mechanismus.

Die Kernlektion ist nicht, dass Cron mysteriös ist; Es besteht darin, dass zwei benachbarte Spalten nicht wie die anderen Einschränkungen kombiniert werden. ToolAcre zentralisiert diese Ausnahme in der Parsing-, Beschreibungs- und Vorschaulogik. Verwenden Sie diese drei Ansichten, um die Nichtübereinstimmung zu erkennen, bevor ein Ausdruck den Browser verlässt und zu einem Betriebsplan wird.