【Linux】Cronって魔法なのかと思ったら超ショートスリーパーだった件
更新日: 2024/05/27
概要
定期実行するときにお世話になる cron さんですが、だれが cron さんに時間を教えてあげているんだろう?私たちから命令を出してるわけではないし、、、自分で時間を把握している?と気になったので ChatGPT とお話しした記録。
会話
デーモンとは
私
Linux のデーモンについて質問です。デーモンはメモリ上で常時起動されているアプリのようなものである。これはあっているか。
GPT
はい、その理解は基本的に正しいです。Linuxのデーモンは、バックグラウンドで実行され、ユーザーの直接的な介入を必要としないプロセスです。これらはシステムの起動時に開始されることが多く、システムが稼働している限りメモリ上で動作し続けます。デーモンは様々なサービスを提供するために存在し、例えばWebサーバー、ファイルサーバー、プリントサービスなどがあります。
Cron のしくみ
私
Cron が動く仕組みを詳しく知りたいです。Cron のデーモンは毎分定義ファイルを確認して実行すべき対象があれば実行するであっていますか?
GPT
はい、その説明は基本的に正確です。CronはUNIX系オペレーティングシステムで使われる時間ベースのジョブスケジューラです。Cronの仕組みは次のようになります:
-
crondデーモンの起動: システムが起動すると、crondデーモンが起動され、バックグラウンドで実行され続けます。
-
ジョブスケジュールの読み込み: crondデーモンは、特定のディレクトリ(通常は
/etc/cron.d/
、/etc/crontab
、ユーザーのcrontab
ファイルなど)にあるスケジュール定義ファイルを読み込みます。 -
スケジュールの確認と実行: Cronデーモンは通常、毎分ごとにこれらのファイルを確認し、現在の時刻とスケジュールされたジョブの時刻を比較します。もし実行すべきジョブがあれば、そのジョブを実行します。
-
ジョブの実行: ジョブがスケジュールに従って実行されると、指定されたコマンドやスクリプトがシステム上で実行されます。
Cronは非常に柔軟であり、毎分、毎時、毎日、毎週、毎月、または週の特定の日にジョブを実行するように設定することができます。ユーザーは自分のジョブをcrontab -e
コマンドを使用して編集することができ、これによりユーザー専用のcrontabファイルが開かれます。
私
crond はどうやって新しい分に変わったことを検知していますか?
GPT
crondデーモンはシステム時計を利用して新しい分に変わったことを検知します。具体的には、次のようなプロセスがあります:
-
スリープとウェイクアップ: crondは通常、一定の間隔でスリープとウェイクアップを繰り返します。具体的には、毎分の始めにウェイクアップするように設計されており、新しい分が始まるたびに処理が行われます。
-
時刻の確認: crondがウェイクアップすると、まず現在のシステム時刻を確認します。この時刻は通常、Unixタイムスタンプ(1970年1月1日からの秒数)としてシステムから提供されます。
-
分の比較: crondは、前回の確認時の分(minute)と現在の分が異なるかどうかをチェックします。もし新しい分になっていれば、その分に対応するジョブがあるかどうかをスケジュールから確認します。
-
ジョブの実行: 新しい分に該当するジョブがスケジュールにある場合、crondはそれらのジョブを実行します。
このプロセスにより、crondは非常に正確に毎分のジョブを実行することができます。システムの時計と連動して動作するため、時計が正確である限り、crondのスケジューリングも正確に行われます。
私
この一定間隔は60秒ですか?
GPT
実際には、crondは必ずしも厳密に60秒ごとにウェイクアップするわけではありません。理想的には、毎分の始めにアクティブになるように動作しますが、実際のウェイクアップ間隔は少し異なる場合があります。具体的には、crondの実装によって異なりますが、多くの場合以下のような動作をします:
- 時刻の確認: crondはシステム時刻をチェックして、現在の秒数を確認します。
- 次の分までの待機: 現在の秒数に基づいて、次の分が始まるまでの残り時間(例えば、59秒の時点であれば1秒後)を計算し、その時間だけスリープします。
この方法によって、crondは毎分のちょうど0秒目にほぼ一致するように動作することができます。これにより、実際のウェイクアップ間隔は1分未満となり、毎分ジョブを実行するための精度が保たれます。
わかったこと
1分より短い時間で寝て、起きたらあと何秒寝れるか計算して、次起きて実行コマンドが予定されたら実行してくれる 超ショートスリーパー
でした。
いつもありがとう。
やっぱり X時Y分0秒に実行されているわけではないんですね。