私はしようとしています:
Ubuntu 14.02 LTSのVixie cronは2番目の構文を拒否しますが、 Wikipedia および公式の仕様によれば有効と思われます。
「crontab」、The Open Group Base Specifications Issue 7 — IEEE Std 1003.1、2013 Edition、The Open Group、2013、2015年5月18日取得
上記の参考文献によると、構文0 0 2-31 * *
は、3番目と5番目のフィールドが実行条件のOR句として扱われるため、毎月ジョブを実行します。
*
ではなく?
を使用する必要があります(これは無効です)。
ウィキペディアのページでは、?
は nnCronのみが使用する非標準の拡張機能 であり、これは使用していません。
いずれの場合も、曜日が*
に設定され、月の日が指定されている場合、曜日は無視されます。参照しているIEEE 1003.1仕様 実際にはこれを示しています 、これらのフィールドがどのように相互作用するかを説明します。
要素またはリストとして月または日が指定されているが、曜日が<アスタリスク>である場合、月および日フィールドは一致する日を指定するものとします。月と曜日の両方が<アスタリスク>として指定されているが、曜日が要素またはリストである場合、指定された曜日のみが一致します。最後に、月または日が要素またはリストとして指定され、曜日も要素またはリストとして指定されている場合、月と日、または曜日に一致する任意の日、一致するものとします。
したがって、正しいフォーマットはまさに論理的なものです:
0 0 1 * * echo First of the month
0 0 2-31 * * echo Not the first of the month
あなたは日付を使うことができます:
0 0 * * * [ $(date +\%d) -eq 1 ] && echo I will run on the 1st
0 0 * * * [ $(date +\%d) -ne 1 ] && echo I will run on all other days
Crondで異なる日付を指定できない場合は、スクリプトを小さなシェルスクリプトで囲みます。
#!/bin/bash
if [[ `date +%d` -eq 01 ]]
then
/path/to/script_a
else
/path/to/script_b
fi
毎日スクリプトを実行し、実行するスクリプトを決定させます。