70

RedHat で Bash を使用しています。毎月第 1 日曜日の午前 9 時に実行するように cron ジョブをスケジュールする必要があります。これどうやってするの?

4

10 に答える 10

168

crontab次のようなものをファイルに入れることができます。

00 09 * * 7 [ $(date +\%d) -le 07 ] && /run/your/script

date +%d現在の日付を表示し、その日付が 7 以下かどうかを確認できます。そうであれば、コマンドを実行します。

このスクリプトを日曜日にのみ実行する場合は、月の最初の日曜日にのみ実行する必要があります。

crontabファイルでは、コマンドの書式設定オプションをエスケープdateする必要があることに注意してください。

于 2010-07-13T22:49:50.357 に答える
14

2 つのアプローチを組み合わせる必要があります。

a)cron毎週日曜日の午前 9 時にジョブを実行するために使用します。

 00 09 * * 7     /usr/local/bin/once_a_week

b) の開始時にonce_a_week、日付を計算し、シェル、Python、C/C++ などを使用して日付を抽出し、1 から 7 の範囲内にあるかどうかをテストします。その場合は、実際のスクリプトを実行します。そうでない場合は、黙って終了します。

于 2010-07-13T20:34:15.970 に答える
6

ハックな解決策: cron ジョブを毎週日曜日に実行するようにしますが、スクリプトは開始時に日付をチェックし、日付が 7 日を超えている場合はすぐに終了します...

于 2010-07-13T20:32:18.803 に答える
5

第 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
于 2014-03-31T15:06:29.203 に答える
0

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 週) までインクリメントします。

そして「で」を使いました。それが詐欺かどうかはわかりません。ただし、主なアイデアは、次の最初の日曜日を見つけることです。ジョブを実行する日付と時刻がわかっているため、その後は任意のスケジューラーに置き換えることができます (ただし、別のスケジューラーでは日付に別の構文が必要になる場合があります)。

于 2010-07-15T19:00:26.420 に答える
0

cron.hourly を使用して別のスクリプトを呼び出すことができます。そのスクリプトは、その月の最初の日曜日で午前 9 時かどうかを確認し、そうであれば、プログラムを実行します。私には十分に最適に聞こえます:-)。

于 2010-07-13T20:17:25.433 に答える
-1

以下を試してください

0 15 10 ? * 1#1

http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

于 2015-10-14T08:32:23.660 に答える