cronデーモンはどれくらい正確ですか?


22

cronジョブスケジューラは本当に正確ですか?

つまり、可能な限り最新のスクリプトを毎晩実行する必要がありますが、翌日の00:00の前に実行する必要があります。

理想的には23.59(または午後11:59)にcronジョブを実行しますが、システムは本当に正確ですか?秒が重要なので、cronジョブを23:58に設定して、しばらく残す必要がありますか?


13
なぜこれらの要件があるのですか?私は、あなたが本当にやろうとしていることを何でもするより良い方法があると感じており、あなたもそれについて尋ねるかもしれません。(cronジョブをスケジュールするよりも少し手間がかかりますが、おそらくそれほど多くはありません。)
デビッドZ

以前は、10分の精度で古いダムcronを使用していました。
joshudson

7
あなたの要件は私にはあまり信頼できないように見えます。深夜にシステムの負荷が高い場合はどうしますか。RTシステムがない限り、何も保証できません。
トーマスエルカー

常に使用可能で、常に1秒未満でジョブを完了することができるサーバーを調達できたとしても、まだうまくいかない可能性があることを考慮してください。たとえば、気付かないうちに時計がドリフトし始める場合があります。これは非常に脆弱であり、システムを変更する必要があるという上記のコメントに同意します。
クリスヘイズ

回答:


24

cronが保証できるのは、指定された時間(システムクロックの精度に応じて)より早くジョブが開始されることです。ただし、ジョブの終了時間について保証する方法はありません。それは多くの要因に依存します:

  • システムの負荷
  • 仕事は何をしますか
  • ハードウェアの問題による遅延
  • ネットワークの問題による遅延(ジョブがネットワークに依存していると仮定)

私の推奨事項は、特定の完了時間が必須ではないように設計を変更することです。


1
これを行う最も簡単な方法は、おそらく、cronを介して開始されたジョブに実行中のファイルを作成させ、ジョブが終了(成功または失敗)するたびに削除し、次のジョブ(目的と仮定)を削除することです。ファイルが消えるまで待ってから、何かをしてください。
CVn

@MichaelKjörlingファイルをチェックしてから作成することはアトミックではないため、ファイルではなくディレクトリを使用する必要があります。
8ビットツリー

1
@ 8bittreeでは、flockが使用可能であればそれも使用できます。
user9517はGoFundMonicaを

1
@MichaelKjörlingしかし、正しいケースも単純なのに、なぜ大丈夫なケースに悩まされるのですか?
8ビットツリー

4
@ 8bittreeを使用O_CREATしてO_EXCLフラグを設定すると、ファイルがローカルファイルシステム上にある限りアトミックになります。
カスペルド

14

これはcronデーモンに依存すると思いますが、ドキュメントと標準では、分を指定すると、指定された分にジョブが実行されることが示されています。

見る:

時計が正しい時刻に達するとスクリプトが開始されますが、その後しばらくするとスクリプトが終了することに注意してください。


非常に低い負荷の仮想サーバーがありますが、毎分実行されるように設定されているcronは、0秒、1秒、2秒、17秒まで起動することがあります。私の推測では、仮想サーバーではcronの精度が低くなる可能性があります。そのサーバーの外部の他のプロセスは、CPUなどのリソースの可用性に影響を与える可能性があるためです。
リアム

8

通常、cronは23:59:00に開始し、すべてのcrontabファイルをスキャンし、23:59に関連するファイルを除外してから開始します。このファイルのスキャンは非常に高速です。これは、ファイルの数が多くなく、すべてに数行しか含まれていないためです。だから、通常は、cronジョブを開始するに午後十一時59分00秒または夜11時59分01秒 、意図的にこのプロセスを遅くすることを確認の方法があります。(たとえば、crontabに数百万行を追加します)。システムが完全に過負荷の場合、これもそれほど速く動作しません。

また、これは明らかに実装依存です。

非常に正確な開始時刻が必要な場合は、希望する時刻までスリープしてから実行するプログラムを作成することをお勧めします(たとえば、c ++ 11を使用)。しかし、非リアルタイムOSでは、これも正確ではありません!また、PCの時計は正確な時間を知りません!

いずれの場合でも、これにより、プログラム(多かれ少なかれ)希望する時間に確実に開始されます。プログラム所定の時間まで正常に終了するという保証はないため、その要件に基づいて何かを変更する必要があると強く信じています。


2
crontabはメモリに保持されていると思います-crontabの背後にあるファイルを(完了時にcrontabに通知するcrontab -eの代わりに)直接編集すると、変更は有効になりません。cronには、どのジョブが実行されているかを判断するためのダウンタイムが大量にあり、ジョブが実行される正確な秒まで「スリープ」できます。
アマダノン株式会社

0

これは、スクリプト全体の実行時間とサーバー時間の精度に依存します。

59 23 * * * /some/script/file.sh

は23:59に正確にスクリプトを起動しますが、長時間動作するコマンドがある場合、スクリプトの一部は真夜中以降に実行される場合があります。


正確には23:59なので、23:59:00から23:59:59になりますか?
AL

2
通常のcronには秒がありません。これらの余分な59秒を取得するには、コードの先頭に「wait(59)」を追加する必要があります。
ヘンリーの猫

4
実際には、@ ALはxx:xx:00またはxx:xx:01で実行されることを常に見てきましたが、負荷の高いシステムでは、約束はありません。
ホッブズ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.