背景
UNIX cronは、次のような状況でジョブを実行することが知られています。誰でも月の日またはアスタリスクワイルドカードの代わりに明示的な値を使用して両方を指定した場合、曜日は一致します。
0 0 * * 1 # every Monday
0 0 1 * * # every month's first day
0 0 1 * 1 # every Monday *and also* every month's first day
0 0 1 * 1-7 # every day
0 0 1-31 * 1 # every day
これらの一般的な例には、すべて*
月フィールドが含まれます。
アスタリスクのない月のPOSIX
POSIX仕様は実際には次のように言います。crontab
(強調):
日付は、日付と曜日の2つのフィールドを使用して指定できます。月、日、曜日にすべて <アスタリスク> 文字が含まれている場合、毎日一致します。月または月の日が要素またはリストとして指定されているが、曜日が<アスタリスク>の場合、[月と月の日]フィールドに一致する日付を指定する必要があります。もし月と月の日付が<アスタリスク>で指定されているが、曜日が要素またはリストの場合、指定された曜日のみが一致します。最後に月またはその月の特定の日付を要素またはリストとして指定し、曜日も要素またはリストとして指定して、任意の日付を一致させます。月と日、または曜日、一致する必要があります。
次のスケジュールが一致すると指定されているようです。誰でも月または曜日:
0 0 * 1 1 # every month's every Monday *and also* every day in January
0 0 * 1-12 1 # every day
0 0 1 1 1 # every month's every Monday *and also* 1 January
実際にアスタリスクのない月
私が知る限り、一般的な現代的または歴史的なクローンの実装は実際にこれを行いません。SVR4 スケジュールされたタスク(これは必ず最初その月の日付と一致または曜日)とその子オープンソラリスそしてイルモスまたビクシークラウンそしてその子孫友達そしてFreeBSD、オープンBSD、ネットワークBSD、トンボBSDそしてアップルシステムクローンと忙しいBoxcrond。
代わりに、これらのすべての実装では、フィールドの形式に関係なく、常に月フィールドの一致が必要であり、2つの月 - 日フィールドと曜日フィールドが日付を含めるか明示的な値を変更するかによって*
論理のみが一致します。傾き:
0 0 * 1 1 # every Monday in January
0 0 * 1-12 1 # every Monday
0 0 1 1 1 # every Monday in January *and also* 1 January
(またはBusyBoxの場合、使用された構文に関係なく、フィールドに値の完全な範囲が含まれているか厳密なサブセットが含まれているかによって異なります)
仕様が間違っていますか?
POSIX仕様で説明されている動作は実際にどこに実装されていますか?欠陥報告書を提出した場合、その説明は修正可能な仕様エラーですか?なぜこのように表現されたのか?
答え1
デジタルUnixv4(別名。OSF1)がこれを実装しました(アーカイブマニュアルページはこちら):
コマンドが実行される日付は、日付と曜日の2つのフィールドで指定できます。両方のフィールドを指定するか、1 つのみ指定できます。あるフィールドのみを使用して日付を指定するには、別のフィールドにアスタリスク(*)を含める必要があります。両方の方法を使用する場合は、いずれかの仕様が満たされている限り、コマンドが実行されます。
これもこうだソラリスそれでも正しいマニュアルページのテキスト明確さが不足していつもそうです。実施例3は、予想される動作を明確に示す。
例3月と曜日の指定
この例では、毎月1日と15日、毎週月曜日にコマンドを実行します。
0 0 1,15*1
ディランcrond
「毎月2番目の月曜日」と解釈され、* * 2 * mon
便利ですが非標準でもあります。正解は質問がリンクされました著者@thanasispは、この点に役立つ資料を提供しています。 「または」行動は以下に由来します。システムVR2(c. 1985)少なくとも。
Open Groupのドキュメントを読むとき、次の点に注意することが重要であることがわかりました。
- RFCと同様に、特定の文脈における特定の単語の賢明な意味
- ⌦... ⌫記号で囲まれたテキストセクション(これらの記号は前後にすべて削除される可能性があるため、これは珍しい規則です。)
crontab 参照のテキストは、一部のオプションの動作を表す[UP] ⌦ ... ⌫
ために表示されます。crontab -e
ユーザー 人テーブルユーティリティの「入力ファイル」セクションにはそのようなタグはありません。
最後に、月または日付が要素またはリストとして指定され、曜日も要素またはリストとして指定されると、その月とその月の日付または日付が一致するすべての日が適用されます。週、するマッチ。
「しなければならない」という言葉を強調したが、疑いの余地がない:
する
POSIX.1-2017準拠の実装では、必須の機能または動作について説明します。アプリケーションは機能や動作の存在に依存する可能性があります。
アプリケーションまたはユーザーに対して実行される動作を説明します。
しかし、システム管理者として、私は間違っていない正式な抽象化を考える傾向があります(間違って実装できない場合は除く)。バグがある場合は、指定された仕様に準拠していない場合は実装にありますPOSIXLY_CORRECT
。