web-dev-qa-db-ja.com

月の最初の日を除く毎日cronjobを実行する

私はしようとしています:

  1. ジョブAを月の最初の日に実行:0 0 1 * *
  2. 月の他の日にジョブBを実行します:0 0 2-31 *?

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句として扱われるため、毎月ジョブを実行します。

3
Marco Marsala

*ではなく?を使用する必要があります(これは無効です)。

ウィキペディアのページでは、?nnCronのみが使用する非標準の拡張機能 であり、これは使用していません。

いずれの場合も、曜日が*に設定され、月の日が指定されている場合、曜日は無視されます。参照しているIEEE 1003.1仕様 実際にはこれを示しています 、これらのフィールドがどのように相互作用するかを説明します。

要素またはリストとして月または日が指定されているが、曜日が<アスタリスク>である場合、月および日フィールドは一致する日を指定するものとします。月と曜日の両方が<アスタリスク>として指定されているが、曜日が要素またはリストである場合、指定された曜日のみが一致します。最後に、月または日が要素またはリストとして指定され、曜日も要素またはリストとして指定されている場合、月と日、または曜日に一致する任意の日、一致するものとします。

したがって、正しいフォーマットはまさに論理的なものです:

0 0 1 * * echo First of the month
0 0 2-31 * * echo Not the first of the month
12
Michael Hampton

あなたは日付を使うことができます:

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
4
parkamark

Crondで異なる日付を指定できない場合は、スクリプトを小さなシェルスクリプトで囲みます。

#!/bin/bash
if [[ `date +%d` -eq 01  ]]
        then
                /path/to/script_a
        else
                /path/to/script_b
fi

毎日スクリプトを実行し、実行するスクリプトを決定させます。

0