cronスケジューリングは実際にどのように実装され、スクリプトが時間通りに実行されるようにしますか?


9

cronジョブについて質問したい。OK、スクリプトをcrontabに配置し、cronデーモンがスクリプトを実行します。

これを理解すると、毎分、cronは各ユーザーのcrontabをチェックして、構成されたスクリプトを実行します。しかし、これは実際にどのように行われますか?子プロセスなどをフォークしますか?

タイミングが失われるため、タスクを順次実行することはできません(たとえば、長時間実行されているスクリプトの終了を待機しているため)。これは実際にどのように実装されていますか?

助けるために、私は低レベルのコードを探していません。(おそらくアルゴリズムの)高レベルの説明、またはほとんどのディストリビューションでこれをどのように実装するかで十分です。

回答:


9

StackOverflowでこのQ&Aが見つかりました:cronは内部でどのようにジョブをスケジュールしていますか?

その投稿とcronに関するウィキペディアの記事からの抜粋

The algorithm used by this cron is as follows:

1. On start-up, look for a file named .crontab in the home directories of 
   all account holders.

2. For each crontab file found, determine the next time in the future that
   each command is to be run.

3. Place those commands on the Franta-Maly event list with their corresponding
   time and their "five field" time specifier.

4. Enter main loop:

   1. Examine the task entry at the head of the queue, compute how far in 
      the future it is to be run.

   2. Sleep for that period of time.

   3. On awakening and after verifying the correct time, execute the task 
      at the head of the queue (in background) with the privileges of the 
      user who created it.

   4. Determine the next time in the future to run this command and place 
      it back on the event list at that time

このSuperUserのQ&Aというタイトル:cronはどのように機能しますか?追加の質問のいくつかをカバーしています。たとえば、cronが同じ時刻にスケジュールされたジョブをどのように処理するかに関する質問。そのスレッドの答えの1つは、cronデーモンが各タスクを処理するときに、スケジュールされた各ジョブをフォークして、重複する時間を持つジョブのブロッカーとして機能する単一のジョブがないことを示しています。


キューの場合、タスクは次々と実行されます(同じキューにあるタスク)。したがって、タスクの実行に3分必要で、キュー内の次のタスクが次の1分間にスケジュールされることが予想される場合、これはどのように行われますか?
ジム、

@ジム-あなたが仮定している単純化の1つは、それがまったく行わないときに毎分ファイルを読み取ることだと思います。ファイルを保存すると、crondデーモンは指定されたユーザーのcrontabの内容を組み込み、実行する予定の将来の時刻に基づいてソートされた順序でキューに追加します。
slm

では、この場合、キューにはを同時に実行する必要のあるタスクが含まれている可能性があります。
ジム

@ジム-まさに。回答の私の追加コメントも参照してください。
slm

cron用に作成した新しいタスクをどのように検出しますか?ファイルシステムを監視するためにinotifyなどを使用していますか?
CMCDragonkai、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.