cron 计时器在哪里

cron 计时器在哪里

有没有办法访问cron计时器并获取距下一次执行脚本的剩余秒数crontab或自上次执行以来的秒数?

答案1

不容易。 crond 等待来自内核的信号并进入睡眠状态。当它收到信号时,它会检查该分钟内是否有任何 cronjobs 要执行,启动这些任务,然后返回睡眠状态。

这是一个非常高效的设计 - 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 作业时,睡眠进程也会被唤醒,但会更新其自己的配置,之后它将以新的超时值返回睡眠状态。

可以看到设置的超时时间。请注意,cron 在进入睡眠状态之前调用了 time 系统调用(它返回自 epoc 以来的秒数),因此如果您观察到这一点(即在调用 time() 系统调用时跟踪进程,您将能够减去当前时间并将其与 pollsys 调用中设置的超时进行比较。

所以...正如我所说,这并不容易。

相关内容