很多时候都要使用到crontab定时执行任务,但你知道crontab到底是怎么执行的吗?接下来就给大家讲解一下crontab执行逻辑。
首先我们把源码clone下来。https://github.com/cronie-crond/cronie是crond的源码
首先我们找台机器,ps看下当前系统的cron进程信息 面有两个crond进程,其中pid=1118的父进程号是1,即systemd,pid=17687的父进程号是1118,以此可知pid=17687是pid=1118的子进程。
从上面可以看到Linux crond进程是一个daemon进程
cron的代码结构中,src是核心逻辑。
main函数在cron.c中,
其中,prefix=NONE
localstatedir=’${prefix}/var’ ;
sysconfdir=’${prefix}/etc’
SPOOL_DIR=’${localstatedir}/spool/cron’ 即/var/spool/cron
SYS_CROND_DIR=’${sysconfdir}/cron.d’ 即/etc/cron.d
SYSCRONTAB=’${sysconfdir}/crontab’ 即/etc/crontab 主要是这三个目录的文件,然后加载到内存里,每一条crontab执行项都会被fork出一个进程执行。
首先看下load_database实现crontab项加载到内存逻辑
Load_database主要实现以下逻辑:判断crontab配置目录的mtime是否改变,如果改变则重新加载crontab配置文件,更新内存,否则直接返回。
比较crontab配置文件所在目录的mtime是否被修改,被修改则重新load对应的crontab内容到内存,否则直接返回,不做任何修改。
然后执行job_runqueue
以上就是cron的逻辑。