“现代”cron
守护进程内部如何安排工作?有些crond
用于通过at
每隔一段时间安排一次运行。因此,在写出crontab之后,crond
:
谢谢,
答案 0 :(得分:51)
在这个问题上听到了一些蟋蟀。很好的RTFC和一些离散事件模拟论文和维基百科:
http://en.wikipedia.org/wiki/Cron#Multi-user_capability
此cron使用的算法为 如下:
- 在启动时,在主目录中查找名为.crontab的文件 所有账户持有人。
- 对于找到的每个crontab文件,确定将来的下一次 每个命令都要运行。
- 将这些命令放在Franta-Maly事件列表中 相应的时间和他们的“五 字段“时间说明符。
- 输入主循环:
醇>
- 检查队列头部的任务条目,计算其中的距离 未来它将被运行。
- 睡了一段时间。
- 在唤醒时和验证正确的时间后,执行任务 队列的头部(在后台) 具有用户权限 创造了它。
- 确定将来下次运行此命令和放置的时间 它回到当时的事件清单上
答案 1 :(得分:4)
我写了一个blog post来描述它。
从那里引用相关文本:
PriorityBlockingQueue
的{{1}}(线程安全堆)来执行所有任务。job.nextExecutionTime()
void goToSleep(job, jobQueue){
jobQueue.push(job);
sleep(job.nextExecutionTime() - getCurrentTime());
}
void executeJob(job, jobQueue){
threadpool.submit(job); // async call
job = job.copy();
job.setNextExecutionTime(getCurrentTime() + job.getExecutionInterval());
jobQueue.add(job);
}
@Override
void run(){
while(true)
{
job = jobQueue.pop()
if(job.nextExecutionTime() > getCurrentTime()){
// Nothing to do
goToSleep(job, jobQueue)
}
else{
executeJob(job, jobQueue)
}
}
}
@Override
void run()
{
while(true)
{
newJob = getNewJobFromCrontabFile() // blocking call
jobQueue.push(newJob)
}
}