说一说linux的crontab执行逻辑

说一说linux的crontab执行逻辑

Posted by lwk on January 6, 2020

很多时候都要使用到crontab定时执行任务,但你知道crontab到底是怎么执行的吗?接下来就给大家讲解一下crontab执行逻辑。

首先我们把源码clone下来。https://github.com/cronie-crond/cronie是crond的源码

首先我们找台机器,ps看下当前系统的cron进程信息 image 面有两个crond进程,其中pid=1118的父进程号是1,即systemd,pid=17687的父进程号是1118,以此可知pid=17687是pid=1118的子进程。

从上面可以看到Linux crond进程是一个daemon进程

cron的代码结构中,src是核心逻辑。 image

main函数在cron.c中,

image

其中,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 image 主要是这三个目录的文件,然后加载到内存里,每一条crontab执行项都会被fork出一个进程执行。

首先看下load_database实现crontab项加载到内存逻辑 image

Load_database主要实现以下逻辑:判断crontab配置目录的mtime是否改变,如果改变则重新加载crontab配置文件,更新内存,否则直接返回。

image image

image 比较crontab配置文件所在目录的mtime是否被修改,被修改则重新load对应的crontab内容到内存,否则直接返回,不做任何修改。 image

image

然后执行job_runqueue

image image

以上就是cron的逻辑。