web-dev-qa-db-ja.com

Linuxでは、前日より3分遅れて毎日スクリプトを実行することは可能でしょうか?

これに対する私の最初の解決策は、date +%Y%m%d%H%Mを実行し、その形式の数値をファイルに入れ、cronから毎分スクリプトを実行することでした。次に、ファイルの日付がdateコマンドと一致する場合、スクリプトは何かを実行します。次に、そのファイルを翌日プラス3分間更新します。これを達成するためのより良い方法はありますか?

その結果、スクリプトは最初の日は(たとえば)午前4時に実行され、2日目は午前4時3分に実行され、3日目は午前4時6分に実行されます。 1分ごとに実行されますが、正しい時間にのみ実行されます(ブロックの場合)。

質問と私の解決策は明確ですか?

4
Elmer

スクリプト(またはラッパー)内から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エントリを変更させることもできますが、それは危険であり、ちょっと厄介でもあります。

2
mjhennig

スクリプトを変更して、最初に実行する時間とともにフラグファイルをチェックすることができます。時間が開始時間と一致する場合、スクリプトは続行されます。それ以外の場合は、exit 0で終了します。また、毎分(または、3分に1回)cronで開始することもできます。また、フラグファイルで次に実行する時間を変更するスクリプトが必要です。それは十分に安全であり、ランダムに再起動した場合でも開始時間を逃すことはありません。

0
rush