隔週のcronjobをスケジュールするには?


10

crontab(5)は以下のフィールドを定義します:

       field         allowed values
       -----         --------------
       minute        0-59
       hour          0-23
       day of month  1-31
       month         1-12 (or names, see below)
       day of week   0-7 (0 or 7 is Sun, or use names)

と説明します:

 Step values can be used in conjunction with ranges.  Following a range
 with ``/<number>'' specifies skips of the number's value through the
 range.  For example, ``0-23/2'' can be used in the hours field to specify
 command execution every other hour (the alternative in the V7 standard is
 ``0,2,4,6,8,10,12,14,16,18,20,22'').

ですから、私の理解では、隔週の仕事はありません。回避策があると確信していますが、あなたはどうしますか?または私は何かを逃したのですか?


2
私はこの上で見つけることができる最良の答えはここにある:unix.stackexchange.com/questions/1224/...
Somantra

...そしてU&Lに対するそれらの答えは、私がそれをする方法だと思います、@ソマントラ:-)
voretaq7

@ voretaq7、私はそれが標準的な答えだと言ったでしょうが、私は知識人として遭遇したくありませんでした;-)
ソマントラ

回答:


8

毎週水曜日にcronで処理を実行し、それを偶数週か奇数週かを決定することができます。例えば:

#!/bin/bash
week=$(date +%U)
if [ $(($week % 2)) == 0 ]; then 
    echo even week
else 
    echo odd week
fi

これは素晴らしい解決策ですが、実際には質問自体には答えません。スケジュールロジックで物事を汚したくないのです。多分私はこれを@Somantraが与えたリンクと統合することができます。
ローマ

承知しました、これは今のところ最善の解決策です。@Somantraが提供するリンクは、同じ結果を不必要に複雑なIMHO(UNIX時間で数える)を達成しますが、同じスタイルで(スクリプトではなく)cronjobに直接アプローチを追加すると、非常にエレガントになります。
ローマン

53週間あるため、これは2020年に中断します。例:cronが12月31日に隔週で実行されるようにスケジュールされている場合、2020年12月31日(第53週)と2020年1月4日(第1週)に実行されます。
mad_fox

4

多くのcron(使用しているものを指定していません)は範囲をサポートしています。だから何か

0 0 1-7,15-21 * 3

月の第1および第3水曜日にヒットします。


これは「スクリプトで実行する」方法よりも少しエレガントですが、crontabにコメントを追加することを忘れないでください(一般的な経験則:複数ある場合、-または/関与している場合は、スケジュールを説明するためにコメントする価値があるでしょう)
voretaq7

これは間違いだと思います。毎月1日から7日、15日から21日まで、および毎週水曜日にもジョブが実行されます。this from man 5 crontab: " コマンドの実行日は、2つのフィールド(日と曜日)で指定できます。両方のフィールドが制限されている(つまり、*でない)場合、どちらかのフィールドがたとえば、 "30 4 1,15 * 5"と指定すると、コマンドは毎月1日と15日の午前4時30分と毎週金曜日に実行されます(私の強調)。
MadHatter、2014年

1
実際には、使用しているcronデーモンによって異なります。あなたのエントリはvixie cron(RedHatディストリビューションに含まれています)からのものであるようです。dillo's cron(Slackware)の "man crontab"から:月の日と曜日の両方を指定すると、*その月のN番目の日として解釈されます*。それでも、スクリプトによるソリューション(週数を計算する)は、唯一のポータブルソリューションのように見えます。
AlvaroGMJ 2015年

2

隔週で実行する必要があるものには、次のワンライナーを使用します。

0 0 * * 5 [ `expr \`date +\%V\` \% 2` -eq 0 ] && echo "execute script" 

この特定のスクリプトは、金曜日に実行されるようにスケジュールされています。実行する週は、 "-eq 0"または "-eq 1"を使用して調整できます。


1

Anacronは、cronの制限に対する適切な回避策です。

  • Anacronには、14に設定できる再発期間パラメーターがあります。

period delay job-identifierコマンド

14 15 test.daily /path/to/script.sh


残念ながら、anacronは使用できません。それを言及するのを忘れました。
ローマ

1

あなたのニーズが文字通り隔週でない場合、あなたは単に月の1日と15日にcronjobを実行することができます:

15 8 1,15 * * /your/script.sh

曜日に関係なく、毎月1日と15日の午前8時15分に実行されます。


-2

その説明から、週フィールドの3/2設定は、他のすべての水曜日にタスクを実行する必要があります-その暗黙的ですが、実行可能だと思います。


いいえ、これはと等価であるfor(int i=3; i <=3 ; i+=2) {} ことはこれだけ一度通過しているので、「ステップ」は1または2であるならば、それは問題ではない
シチュー

@stewが言ったこと。また、「週フィールド」はありません。
ローマ

週フィールドとは、「曜日フィールド」を意味します
ジャーニーマンオタク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.