2週間ごとに実行するようにクローンジョブをスケジュールする方法はありますか?
(私が考えることができる1つの方法は、crontab
2つの「日付」項目を追加することです...)
答え1
いいえ、cronは曜日、1月の日付、月だけを知っています。
月に2回固定された日付(1日と16日など)でコマンドを実行するのは簡単です。
42 4 1,16 * * do_stuff
隔週でコマンドを実行するのは別の話です。あなたができる最善の方法は、毎週コマンドを実行し、隔週で何もしないようにすることです。 Linuxでは、エポック()以降の秒数を1週間の秒date +%s
数で割ることで、週間のロールオーバーパリティ値を取得できます。 crontabでは%
エスケープが必要です(cronは%
コマンドを実行する前に改行されます)。
42 4 * * 1 case $(($(date +\%s) / (60*60*24*7))) in *[02468]) do_stuff;; esac
答え2
cron
2週間ごと(2週間ごと)ジョブを直接実行することはできません。ただし、タスクの主要部分を隔週で実行することは非常に簡単です。 @Gillesは1つのソリューションを提供しました。ここに別の解決策があります。
42 4 * * 1 test 1 -eq $(($(date +\%g) & 1)) && do_stuff...
このdate +%g
コマンドは現在の週数(年の週数)を返し、ビットAND演算は1または0を返します。その後、実際のジョブを実行できるかどうかを判断するために使用されます。
パーセント記号に対する同じ警告%
:特別に扱われないcrontab
ように、項目内でエスケープする必要があります。cron
答え3
パーティーに遅れていることはわかりますが、誰もが問題に対する1つまたは2つの解決策を望んでいます...
日曜日を除いてOPと同じことをしたいので、この投稿を見つけました。
@user140906には、このコードスニペットを実行するときに観察できる有効な懸念があります。
for n in $(seq 17 33); do ncal -A1 -bw dec 20${n}; done
最初は6年ごとに繰り返されるようでした。みんな確認してないよ! :-)
それからこれを見つけました。協会これは、動作する必要がある@gilles-so-stop-being-evilに似た2つの解決策を提供します。最も明確な解決策は次のとおりです。
#!/bin/bash
# a file marking the state on disk
mark_file=$HOME/.job-run-marker-1
# check whether the job run last time it is invoked
if [ -e $mark_file ] ; then
rm -f $mark_file
else
touch $mark_file
exit 0
fi
# job command is here
たとえば、crontab エントリを追加します。
0 2 * * 2 my_script
複数の項目で使用するように簡単に調整できます(ハードコーディングではなくcrontab
値を渡す)。または、いくつかの魔法を使用して同じロジックをmark_file
拡張して、ファイルのIDと状態/それぞれを表す/削除/追加行を追加します。ジョブが実行されました。ID
grep
awk
sed
とにかく、これが誰かに、たぶん将来に私にも役立つことを願っています!