crontab のドキュメントを読んだ後、次のスケジュールを記す方法が思いつきません: スクリプトを 45 日ごとに 1 回実行します。
誰かエレガントな解決策を知っていますか? ありがとうございます。
答え1
45 日間の期間はグレゴリオ暦の週、月、または年にうまく分割されないため、スクリプトが実行される日付を制限し、必要なすべての日にスクリプトを実行する方法はありません。
そのため、コマンドを毎日実行し、45 日のうち 44 日は何もせずにコマンド自体を返す必要があります。
たとえば、スクリプトを 03:17 に実行する場合、コマンドは次のようになります。
17 3 * * * /usr/local/bin/your-script
スクリプト内では次のように実行できます。
#!/bin/bash
if [[ $[($(date +%s)/86400)%45] != 0 ]]
then
return
fi
real things happen here
この!= 0
部分は、最初に実行する日に応じて異なる番号を使用できます。また、その追加ロジックをスクリプトではなく crontab に配置することもできますが、個人的にはスクリプトで実行する方が読みやすいと思います。
タイムゾーンで DST が使用されている場合は、時計の調整時にスケジュールが 1 日ずれるのを避けるために、上記の設定を微調整する必要がある場合があります。正確な詳細は、スクリプトを実行するために選択したタイムゾーンと時刻によって異なります。
答え2
cronjobのエントリを2つ使用する必要がある場合があります。1つ目は1か月用、2つ目は45日間用です。
毎月以下のcronを使用する
0 0 1 * * your_script
そして45日後のこのcronエントリ
10 13 * * * test $(( `date +\%s`/24/60/60\%45 )) = 41 && your_script
45日間のcronスケジュールについては、以下のリンクから参照しました。
https://stackoverflow.com/questions/8699075/how-to-set-cron-job-for-every-45-days