Cron 任务计划程序如何启动作业?

Cron 任务计划程序如何启动作业?,cron,scheduled-tasks,scheduler,Cron,Scheduled Tasks,Scheduler,当任务调度器(例如cron)触发任务(例如cron作业)时,它是通过每最短时间段(例如秒)“轮询”时钟来实现的,还是在时间到来时注册一个“推送”的回调 如果是推送/回调,底层平台(如linux)是如何实现的?对于基于时间的事件,是否存在“硬件中断”或其他回调机制 那么,任务计划程序如何启动作业呢?从手册页: 然后cron实用程序每分钟都会唤醒一次,检查所有存储的crontab,检查每个命令,看它是否应该在当前分钟内运行。执行命令时,任何 输出通过邮件发送给crontab的所有者(或者发送给cro

当任务调度器(例如cron)触发任务(例如cron作业)时,它是通过每最短时间段(例如秒)“轮询”时钟来实现的,还是在时间到来时注册一个“推送”的回调

如果是推送/回调,底层平台(如linux)是如何实现的?对于基于时间的事件,是否存在“硬件中断”或其他回调机制

那么,任务计划程序如何启动作业呢?

从手册页:

然后cron实用程序每分钟都会唤醒一次,检查所有存储的crontab,检查每个命令,看它是否应该在当前分钟内运行。执行命令时,任何 输出通过邮件发送给crontab的所有者(或者发送给crontab中MAILTO环境变量中指定的用户,如果存在)

守护进程是用于运行后台进程的程序。和克朗 是执行预定命令的守护进程。获取这些命令 Cron查找/etc/crontab或/usr/lib/Cron/tabs和 如果存在任何命令文件,Cron将执行该文件。克朗 实用程序由已启动的进程启动,该进程将init替换为 pid 1


最终可能取决于实施情况。有些执行轮询(如上所述),但有些使用中断方法(检查何时必须运行下一个任务并设置系统警报)。

Unix版本7上的cron具有以下算法:

其算法非常简单:

1) 读取/usr/etc/crontab 2) 确定是否必须在当前日期和时间运行任何命令,如果是,请以超级用户root身份运行这些命令。 3) 睡一分钟 4) 重复步骤1

但这对系统来说是沉重的负担。并用于为多用户环境占用大量资源。然后设计了一种新算法:

此cron使用的算法如下所示:

1) 启动时,在所有帐户持有人的主目录中查找名为.crontab的文件。 2) 对于找到的每个crontab文件,确定今后必须运行每个命令的下一次时间。 3) 将这些命令及其相应的时间和“五字段”时间说明符放在Franta Maly事件列表上。 4) 进入主循环:

  • 检查队列头部的任务条目,计算 它必须运行的未来
  • 睡一段时间
  • 在唤醒时和验证正确时间后,以创建任务的用户的权限在队列的前端(后台)执行任务
  • 确定将来下一次运行此命令的时间,并将其按该时间值放回事件列表

  • 现代的实现是vixiecron和anacron。这被fcron取代。我对它们的实现细节没有太多的了解。

    这个问题的目的不是关于CRON,而是通常以CRON为例进行任务调度,如果问题陈述中不清楚的话,很抱歉

    我想知道最底层的软件是如何进行基于时间的调度的,如果它必须轮询硬件时钟,或者对于基于时间的事件是否存在某种硬件中断

    事实证明,实际上有一个硬件中断。来自wilipedia:

    一个典型的用途是通过将 晶体振荡器的输出,具有中断处理程序计数 为了保持时间,电话中断了。这些周期性中断是 通常被操作系统的任务调度器用来重新安排任务的优先级 运行进程。一些较旧的计算机产生周期性中断 从电源线频率,因为它是由 消除电子钟长期漂移的实用程序


    因此,尽管cron进行轮询(感谢@joshua nelson),但也有可能不进行轮询,操作系统也不进行轮询。

    这是我最感兴趣的,不是cron,而是最低级别触发器的触发方式。如果这是由操作系统设置的,它是如何依次触发的?操作系统是否“轮询”或是否存在任何类型的“基于时间的硬件中断”。。。