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を呼び出すで設定したタイムアウトと比較します。
だから…申し上げたほど簡単ではありません。