日本語

開発者ツール · Crontab ジェネレーター

cron での日付と曜日: 誰もが驚く OR ルール

· 仕組み

クロン カレンダー スケジュール設定

OR ゲートを介して 1 つのスケジュールに結合される 2 つのカレンダー フィルター
オリジナル ToolAcre ベクトル イラスト

両方の日付フィールドが制限されている場合、cron はどちらかが一致するとジョブを実行します。この投稿では、crontab(5) のルール、そのルールが存在する理由、およびそれによって妨げられるスケジュールを取得する方法について説明します。

レポートは 1 日と毎週月曜日に実行されました。式 0 9 1 * 1 は、その見た目を意味するものではありません

`0 9 1 * 1` などの式は、2 日分の列が累積フィルターとして読み取られる場合、「最初の月曜日の 09:00」のように見えます。 ToolAcre はそのようには読みません。日付を 1 に設定し、曜日を月曜日に設定すると、パーサーはどちらの条件も一致する可能性があると警告するため、スケジュールには毎月第 1 月曜日と毎週月曜日が含まれます。

これは細かい表現上の好みではありません。月次レポートは追加で 4 ~ 5 回実行でき、月曜日にのみ実行されるはずの操作を月の初日に実行することもできます。ジェネレーターは説明の横に「確認する価値があります」という警告を表示するため、式が外部 crontab にコピーされる前に拡張された動作が表示されます。

記述されたルール — 月日と曜日の両方が制限されている場合、いずれかのフィールドが一致するとコマンドが実行されます。

実装の `dayMatches` 関数は 4 つのケースを明示的に処理します。 2 つのワイルドカードはすべての日付を受け入れます。ワイルドカードの日付は平日に準拠します。ワイルドカードの平日は月の日に準拠します。 2 つの制限されたフィールドは、それらの一致の論理 OR を返します。テストでは、13 日のみ、金曜日のみ、どちらの条件にも一致しない日付が対象になります。

説明では同じルールが維持されます。 `0 0 13 * 5` は、曖昧な接続詞ではなく、「毎月 13 日または金曜日」と表示されます。解析、次回実行の選択、および英語の出力はすべて同じ解釈を使用します。これらのパス間の不一致はすぐに誤解を招くプレビューを作成してしまうため、その共有された動作は、孤立したヘルプ ラベルよりも強力な証拠となります。

パーサーは OR を実装し、結果を公開します。ルールの歴史を確立するものではありません

ワークブックの概要では、OR 設計の歴史的な理由が示されていますが、このリポジトリは来歴ではなく動作を証明しています。コードのコメントは Vixie スタイルのルールを識別し、テストは ToolAcre によってモデル化された結果を確立します。誰がそのルールを選択したのか、いつ採用されたのか、なぜ寛容な解釈が好まれたのかについては文書化されていない。

テクニカル ライティングでは、その境界を維持することが重要です。読者は、このツールが式をどのように拡張するかを正確に知る必要があります。安全に使用するために、でっち上げられた標準の説明は必要ありません。デプロイメントターゲットが異なる日のセマンティクスを文書化している場合は、その独自のマニュアルがこのブラウザーのプレビューよりも優先されます。 ToolAcre は、すべてのスケジューラが同意していると主張するのではなく、計算する方言を述べています。

有効な例: 0 9 1 * 1 を 1 か月間列挙 — 作成者が希望したスケジュールと比較した、起動日

初日が月曜日ではない月を考えてみましょう。 `0 9 1 * 1` は、最初の実行時に 1 回の実行を生成し、毎週月曜日に追加の実行を生成します。最初の日付自体が月曜日の場合でも、次回実行される検索では 2 つの別々のトリガーではなく 1 暦分が考慮されるため、その日付は 1 回表示されます。結合のサイズはカレンダーに応じて変化しますが、ロジックは変化しません。

タイムゾーンを選択し、次の 5 つの実行を読み取ることで、その結合を検査できます。プレビューは厳密に現在の瞬間の後に開始され、月、日、および時刻のフィールドを適用してカレンダーの日付を検索します。ライブリストは読者がチェックを実行する時期と場所によって異なるため、記事の散文で特定の月を約束するものではありません。

AND スタイルの第一月曜日コマンドの回避策は、このスケジュール ジェネレーターの対象外です

計画では、AND 動作を取得するためにシェル日付テストを埋め込むことが提案されました。 ToolAcre はそのようなコマンドを検証できません。コマンドは 5 つのスケジュール フィールドのみを受け入れ、コピーされた完全な行にはプレースホルダーの実行可能ファイルが含まれています。シェル構文、パーセントエスケープ、コマンドの可用性、および終了動作はすべて、最終的にジョブを実行する環境に属します。

このジェネレーター内では、OR 共用体が真に意図されている場合を除き、安全な設計上の措置は、1 日フィールドを `*` のままにすることです。最初の月曜日の要件については、5 フィールド cron だけではこの方言の交差を表現しないことを文書化してください。未実行のスニペットを保証として提示するのではなく、環境固有のソリューションを個別に選択してテストします。

他のスケジューラ演算子は、この 5 フィールド パーサーでは解釈されません。

一部のスケジューラー文法は、`#`、`L`、`W`、`?` などの演算子を公開しますが、このパーサーはそれらのどれも受け入れません。また、6 つのフィールドを拒否し、その規約は 5 フィールドの crontab 構文であると説明しています。したがって、別の製品で機能する式を、同じカレンダー ルールが存在する証拠としてここに貼り付けることはできません。

方言の翻訳は、検証が成功するまで句読点を削除するのではなく、ソース文法とターゲット文法を識別することから始まります。 ToolAcre は、ターゲットの 5 つの通常のフィールド、名前、範囲、リスト、およびステップを構築するのに役立ちます。サポートされていない演算子によって運ばれるセマンティクスを保持することはできません。また、記事では、それらの外部演算子をあたかも実装されているかのように記述することを意図的に避けています。

コマンドのエスケープは式のみの文法の範囲外です

パーセント記号とコマンド引用符はスケジュールの後に表示され、`parseCron` の範囲外になります。パーサーは、1 つの式を空白で区切られた正確に 5 つの部分に分割します。シェル パイプライン、日付コマンド、またはエスケープされたコマンド ペイロードを読み取ることはありません。したがって、ワークブックではパーセント記号による回避策が提案されていますが、この記事ではパーセント記号による回避策については説明しません。

その省略は正しいかどうかの判断です。スケジュール ツールは、タイミング フィールドが検証されるためコマンドが安全であると暗示するべきではありません。無害な入力と観察可能な出力を使用して、実際の cron 実装とシェルのコマンド構文を確認します。ジェネレーターの結果の範囲を、ジェネレーターが明らかに理解できるカレンダー ルールに限定してください。

要点: 両方ではなく、1 日のフィールドを制限してください。また、ジェネレーターの説明では、行を保存する前に OR が表示されます。

両方の日付フィールドが制限されている場合は、それらを結合として読み、「または」と声に出して言います。さらに良いのは、発電機の警告と今後の実行を検査することです。これらの日付が意図したセットを超えている場合は、1 つのフィールドを `*` に返し、ターゲット環境によって文書化されたメカニズムを使用して、より特殊な要件を解決します。

重要な教訓は、cron が神秘的であるということではありません。それは、他の制限のように、隣接する 2 つの列が結合しないということです。 ToolAcre は、その例外を解析、説明、プレビュー ロジックで一元管理します。これら 3 つのビューを使用して、式がブラウザから出て操作スケジュールになる前に不一致を見つけます。