これに対する私の最初の解決策は、date +%Y%m%d%H%M
を実行し、その形式の数値をファイルに入れ、cronから毎分スクリプトを実行することでした。次に、ファイルの日付がdateコマンドと一致する場合、スクリプトは何かを実行します。次に、そのファイルを翌日プラス3分間更新します。これを達成するためのより良い方法はありますか?
その結果、スクリプトは最初の日は(たとえば)午前4時に実行され、2日目は午前4時3分に実行され、3日目は午前4時6分に実行されます。 1分ごとに実行されますが、正しい時間にのみ実行されます(ブロックの場合)。
質問と私の解決策は明確ですか?
スクリプト(またはラッパー)内からat
コマンドを使用できます。次の反復を実行する時間を与えます。
echo '/dir/scriptname' | at 'now + 1443 minutes'
ドリフトを減らすために、その行をスクリプトの先頭にできるだけ近づけてください。
at
の代わりにcron
を使用する必要があります。これにより、タスクを1回だけ実行できます。その後、それ自体を再スケジュールすることができます。
さて、私はあなた自身の解決策へのいくつかの改善を提案したいと思います-あなたがそれに固執するならば。ただし、それでもcron
を介して毎分スクリプトを実行する必要があります。
スクリプトが最後に実行されたときにセットアップや追跡を操作する代わりに、UNIXタイムスタンプを使用して同じ目標を達成できます。
1日は60*60*24 = 86400
秒です。要件から3*60 = 480
を追加すると、86880
秒になります。これは、スクリプトを実行する間隔とまったく同じです。スクリプト内で、現在のUNIX時間%(モジュロ)この秒数がゼロに等しいかどうかを確認し、そうでない場合は中止することができます。
2012年6月5日午前4時のように、明示的な初回実行が必要な場合は、最初に現地時間から関連するタイムスタンプ(1338861600
)を減算し、ゼロ以上であることを確認してください。違いを続行します...
もちろん、スクリプトにそれ自体のcrontab
エントリを変更させることもできますが、それは危険であり、ちょっと厄介でもあります。
スクリプトを変更して、最初に実行する時間とともにフラグファイルをチェックすることができます。時間が開始時間と一致する場合、スクリプトは続行されます。それ以外の場合は、exit 0で終了します。また、毎分(または、3分に1回)cronで開始することもできます。また、フラグファイルで次に実行する時間を変更するスクリプトが必要です。それは十分に安全であり、ランダムに再起動した場合でも開始時間を逃すことはありません。