我想知道cron
内部是如何运作的。该进程是否在无限 while 循环中不断检查当前时间(从而不断消耗 CPU 周期)?或者某些函数是否会生成中断并通知cron
守护程序?
答案1
我曾经读过 vixie-cron 源代码,不得不住院。但是,如果您将来要查找“某个函数生成中断”,则应该研究alarm(2)
系统调用。它要求内核SIGALRM
在预定时间向您发送信号,然后您可以捕获该信号。同时,您的流程可以做其他事情,或者sleep()
像我在医院所做的那样。
答案2
我确信它的工作方式有很多变化dcron(又名 Dillon 的 cron 守护进程)的特点是它一次睡眠时间长达 60 秒,如果需要,它会尝试通过减少睡眠时间来同步,以便在每分钟 00 秒醒来。
它使用sleep()
它使进程进入睡眠状态(除非发生信号)而不使用 CPU。当它醒来时,它会检查文件cron.update
(通过crontab
编辑创建)。如果需要,它会重新创建其运行队列,运行预期的任务,然后再次休眠。
至少有一个 cron 守护进程 ( fcrond
) 使用由 crontab 编辑发送到 cron 守护进程的信号,而不是睡眠/检查方法。
我从未见过 crond 运行频率超过每分钟一次,因此它们通常占用的资源很少。
在 Linux 上,如果您查看/proc
字节读/写或 iowait 等内容,crond
您可能会发现它的使用率相对较高,这是因为它最终会占用它启动的所有子进程,例如在 CentOS 5.x 上:
# grep "^[rw]" /proc/`pgrep crond`/io
rchar: 153463658151
wchar: 91095820045
read_bytes: 44480745472
write_bytes: 2261389312
(在这种情况下,感谢计划的软件包更新以及 ASLR/预链接任务)
也可以看看https://stackoverflow.com/questions/3982957/how-does-cron-internally-schedule-jobs。