cron
にアクセスする方法はありますか? タイマーを設定し、crontab
でスクリプトが次に実行されるまでの残り秒数を取得します それとも最後から数秒ですか?
承認された回答:
簡単ではありません。 crondはカーネルからのシグナルを待ち、スリープ状態になります。シグナルを受信すると、その分に実行するcronジョブがあるかどうかを確認し、それらを起動してスリープ状態に戻ります。
これは非常に効率的な設計です。cronはスリープ中にCPUを使用しません。時間の経過も意識していません。スリープ状態になると、「登録された」cronジョブからの次のコマンドを実行するまでの時間に基づいて「タイムアウト」が設定されます。
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ジョブを更新すると、スリーププロセスもウェイクアップされますが、独自の構成が更新された後、新しいタイムアウト値でスリープに戻ります。
設定されたタイムアウトを確認することができます。 cronがスリープ状態になる直前にtimesyscallを呼び出した(epocからの秒数を返す)ことに注意してください。これを観察した場合(つまり、time()syscallを呼び出したときにプロセスをトレースした場合は、減算できます。現在からの時間で、pollsys呼び出しで設定されたタイムアウトと比較します。
だから…私が言ったように、簡単ではありません。