クローンタイマーはどこにありますか

クローンタイマーはどこにありますか

cronタイマーにアクセスして、次のスクリプト実行までの残り時間(秒)crontabまたは最後の実行以降の時間(秒)を取得する方法はありますか?

ベストアンサー1

簡単なことではありません。 crond はカーネルの信号を待ち、スリープ状態に切り替わります。シグナルを受信すると、その1分以内に実行するcronjobがあることを確認し、そのジョブを開始してからスリープモードに戻ります。

これは非常に効率的なデザインです。 cronはスリープ中にCPUを使用しません。また、時間の流れを認識しません。スリープモードに切り替えると、「登録済み」cronjobの次のコマンドを実行する時間に基づいて「タイムアウト」を設定します。

Solaris 10の場合:

sol10-primary:/> # pflags  271  
271:    /usr/sbin/cron
        data model = _ILP32  flags = ORPHAN|MSACCT|MSFORK
 /1:    flags = ASLEEP  pollsys(0x8047c70,0x1,0x8047ce8,0x806ba00)

cronデーモンを追跡するとタイムアウトが発生し、次のようにスリープモードに移行することがわかります。

waitid(P_ALL, 0, 0x08047CD0, WEXITED|WTRAPPED|WNOHANG) Err#10 ECHILD
time()                                          = 1361952435
pollsys(0x08047C70, 1, 0x08047CE8, 0x0806BA00) (sleeping...)
        fd=3  ev=POLLRDNORM rev=0
        timeout: 105.000000000 sec
        sigmask = 0 0 0 0

クローンジョブを更新すると、スリープモードも解除されますが、独自の設定を更新した後、新しいタイムアウト値でスリープモードに戻ります。

設定されたタイムアウトが表示されます。 cronはスリープモードに移行する前にタイムシステムコールを呼び出すので(epoc以降の秒数を返します)、これを観察すると(つまり、time()システムコールが呼び出されたときにプロセスを追跡すると、現在の時刻を確認してpollssysを呼び出すで設定したタイムアウトと比較します。

だから…申し上げたほど簡単ではありません。

おすすめ記事