当前位置: 首页 > Linux

Linuxcron源码分析

时间:2023-04-06 21:49:59 Linux

背景及busybox介绍BusyBox是一个按照GPL协议作为自由软件发布的应用程序。Busybox在单个可执行文件中提供了一个精简的Unix工具集,可以运行在多种POSIX环境操作系统上,如Linux(包括Android[6])、Hurd[7]、FreeBSD8等。文件大小BusyBox可执行文件比较小,通常使用Linux内核,这使得它非常适合在嵌入式系统中使用。作者称BusyBox为“嵌入式Linux的瑞士军刀”。BusyBox中嵌入了很多Linux常用的工具,如cp、mv、cron等,本次我们分析BusyBox中的cron进程。原代码流程图如下。数据结构如下。用户输入的cron配置解析后,存储在以下两个结构中。typedefstructCronFile{structCronFile*cf_next;结构CronLine*cf_lines;char*cf_用户名;smallintcf_wants_starting;/*bool:一个或多个作业就绪*/smallintcf_has_running;/*bool:一个或多个作业正在运行*/smallintcf_deleted;/*标记为删除(但仍有正在运行的作业)*/}CronFile;typedefstructCronLine{structCronLine*cl_next;字符*cl_cmd;/*shell命令*/pid_tcl_pid;/*>0:正在运行,<0:需要在这一分钟内启动,0:休眠*/#defineSTART_ME_REBOOT-2#defineSTART_ME_NORMAL-1#ifENABLE_FEATURE_CROND_CALL_SENDMAILintcl_empty_mail_size;/*仅邮件头的大小,如果没有邮件文件则为0*/char*cl_mailto;/*将结果邮寄给谁,可以为NULL*/#endifchar*cl_shell;/*按大小排序,而不是自然顺序。使代码更小:*/charcl_Dow[7];/*0-6,开始g星期日*/charcl_Mons[12];/*0-11*/charcl_Hrs[24];/*0-23*/charcl_Days[32];/*1-31*/charcl_Mins[60];/*0-59*/}cron的使用方法分析由于cron的时间同步机制的问题,两个任务之间的时间间隔不一定准确。例如,假设计划任务设置为每分钟运行一次,从10:10:56开始执行。然后根据它的时间同步对齐机制,下次会在10:11:00执行,也就是中间只有4秒,下次是10:12:00,会返回普通的。Linux自带的cron是基于绝对时间的。什么意思,就是运行任务的时间差是根据NTP来的。如果你的NTP挂了,或者手动调整时间,都会影响定时任务的运行。如果调整时间超过1小时,cron会报错,这个循环不会执行。cron定时任务定义的最小时间间隔为1分钟。