有没有办法访问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 调用中设置的超时进行比较。
所以...正如我所说,这并不容易。