web-dev-qa-db-ja.com

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

Cronジョブについてお聞きしたいのですが。 OK、スクリプトをcrontabに配置し、cronデーモンがスクリプトを実行します。

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

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

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

9
Jim

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デーモンが各タスクを処理するときに、スケジュールされた各ジョブをフォークして、時間の重複するジョブのブロッカーとして機能するジョブが1つもないことを示しています。

9
slm