RedHat で Bash を使用しています。毎月第 1 日曜日の午前 9 時に実行するように cron ジョブをスケジュールする必要があります。これどうやってするの?
10 に答える
crontab次のようなものをファイルに入れることができます。
00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script
はdate +%d現在の日付を表示し、その日付が 7 以下かどうかを確認できます。そうであれば、コマンドを実行します。
このスクリプトを日曜日にのみ実行する場合は、月の最初の日曜日にのみ実行する必要があります。
crontabファイルでは、コマンドの書式設定オプションをエスケープdateする必要があることに注意してください。
2 つのアプローチを組み合わせる必要があります。
a)cron毎週日曜日の午前 9 時にジョブを実行するために使用します。
00 09 * * 7 /usr/local/bin/once_a_week
b) の開始時にonce_a_week、日付を計算し、シェル、Python、C/C++ などを使用して日付を抽出し、1 から 7 の範囲内にあるかどうかをテストします。その場合は、実際のスクリプトを実行します。そうでない場合は、黙って終了します。
ハックな解決策: cron ジョブを毎週日曜日に実行するようにしますが、スクリプトは開始時に日付をチェックし、日付が 7 日を超えている場合はすぐに終了します...
第 1 月曜日、第 3 火曜日、先週の日曜日など、何でも cron タスクを実行します。
http://xr09.github.io/cron-last-sunday/
スクリプトをパスに入れてrun-if-today、cron で使用するだけです。
30 6 * * 6 root run-if-today 1 Sat && /root/myfirstsaturdaybackup.sh
スクリプトはrun-if-today、正しい日付の場合にのみ 0 (True の bash 値) を返します。
編集:
インターフェースがよりシンプルになり、週番号のパラメーターが 1 つだけになりました。
# run every first saturday
30 6 * * 6 root run-if-today 1 && /root/myfirstsaturdaybackup.sh
# run every last sunday
30 6 * * 7 root run-if-today L && /root/lastsunday.sh
cron に毎日または毎週日曜日にジョブを実行させたくない場合は、コードを実行するラッパーを作成し、次の最初の日曜日を決定し、その日に実行するようにスケジュールすることができます。
次に、そのラッパーをその月の次の第 1 日曜日にスケジュールします。その後はすべて自分で処理します。
コードは次のようになります (何かを強調...エラーチェックは行われません):
#! /bin/bash
#We run your code first
/path/to/your/code
#now we find the next day we want to run
nskip=28 #the number of days we want to check into the future
curr_month=`date +"%m"`
new_month=`date --date='$nskip days' +"%m"`
if [[ curr_month = new_month ]]
then
((nskip+=7))
fi
date=`date --date='$nskip days' +"09:00AM %D` #you may need to change the format if you use another scheduler
#schedule the job using "at"
at -m $date < /path/to/wrapper/code
次の最初の日曜日を見つけるロジックは簡単です。今月の最初の日曜日に開始するので、28 を足すと、今月の最後の日曜日か翌月の最初の日曜日になります。今月の場合は、次の日曜日 (翌月の第 1 週) までインクリメントします。
そして「で」を使いました。それが詐欺かどうかはわかりません。ただし、主なアイデアは、次の最初の日曜日を見つけることです。ジョブを実行する日付と時刻がわかっているため、その後は任意のスケジューラーに置き換えることができます (ただし、別のスケジューラーでは日付に別の構文が必要になる場合があります)。
cron.hourly を使用して別のスクリプトを呼び出すことができます。そのスクリプトは、その月の最初の日曜日で午前 9 時かどうかを確認し、そうであれば、プログラムを実行します。私には十分に最適に聞こえます:-)。
以下を試してください
0 15 10 ? * 1#1
http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger