cron 守护进程的内部是如何工作的?

avi*_*avi 8 cron

我想知道cron内部是如何运作的。进程是否在无限循环中不断检查当前时间(从而不断消耗 CPU 周期)?还是某个函数会产生中断并通知cron守护进程?

小智 10

曾经读过vixie-cron的源代码,不得不住院治疗。但是,如果您正在寻找将来某个时间“某个函数生成中断”,则应该调查alarm(2)系统调用。它要求内核SIGALRM在预定时间向您发送信号,然后您就可以捕获该信号。同时,您的过程可以做其他事情,或者sleep(),就像我在医院所做的那样。

  • 为幽默点赞。 (7认同)

mr.*_*tic 6

我确定有很多变化,它在dcron(又名 Dillon 的 cron 守护进程)中的工作方式是一次最多休眠 60 秒,它会尝试通过在需要时减少休眠来同步它,以便在每分钟的 00 秒。

它使用sleep()which 在不使用 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
Run Code Online (Sandbox Code Playgroud)

(由于计划的包更新,以及在这种情况下的 ASLR/预链接任务)

另见/sf/ask/278807021/