当前位置 博文首页 > JustinQin:Linux-- 定时服务crond VS anacron和 crontab VS ana

    JustinQin:Linux-- 定时服务crond VS anacron和 crontab VS ana

    作者:[db:作者] 时间:2021-09-12 08:58

    学习背景

    一般实际的项目中多多少少都可能会涉及到定时任务的场景,比如定时nginx日志清理及备份tomcat日志滚动MySQL数据库自动备份批量解析数据文件导入导出等等,定时任务执行的对象可能是shell脚本等指令文件。而定时任务的实现,在Java工程当中,可以通过Spring Quartz配置定时任务,在Linux服务器可以通过自带的crond服务配置定时任务,方式有很多种,本文主要介绍Linux服务自带的定时服务,有crondanacroncrontabanacrontab,这四种服务相互联系,但又有一定的区别。

    进入正文~

    一、crond VS anacron

    • crond是Linux操作系统自带的定时服务,自带守护进程,一般用于运行计划任务如系统备份日志分割级清理crond服务更适合在那些24x7不间断运行的机器如服务器上运行的计划任务。
    • anacron则是较新版Linux操作系统自带的定时服务,CentOS 6.0后系统会自带anacron服务,没有守护进程,需要依赖crond服务运行,也是常用于运行计划任务如系统备份日志分割级清理但anacron服务比较适合用在一天内或一周内会重启的机器上运行的计划任务。

    主要区别对比:

    crondanacron
    有守护进程,ps -ef|grep crond查看没有守护进程,依赖crond运行
    二进制文件/usr/sbin/crond二进制文件/usr/sbin/anacron
    定时任务全局配置文件/etc/crontab定时任务全局配置文件/etc/anacrontab
    可配置定时任务的时间最小单位是分钟可配置定时任务的时间最小单位是
    普通用户可使用crontab -e/etc/crontab也仅root用户可配置root用户可配置
    比较适合持续运行不关机的服务器比较适合可能会一天内或一周内关机,重新开机后会重新运行缺失的计划任务的服务器

    二、crond/crontab、anacron/anacrontab说明

    2.1、crond

    • crond服务可配置最小时间单位为分钟级的定时服务,而anacron服务仅提供日级的定时任务,并且需要依赖于crond服务来实现

    • 查看crond服务运行状态
      systemctl status crond.service
      在这里插入图片描述
      running表示运行状态~

    • 查看crond服务后台进程
      ps -ef|grep crond
      在这里插入图片描述
      可以看到crond的守护进程是通过/usr/sbin/crond -n来实现的。

    • crond的后台进程,会每分钟去加载是否有要执行的定时任务。

    • crond服务其他常用命令
      systemctl status crond.service
      systemctl start crond.service
      systemctl restart crond.service
      systemctl stop crond.service
      systemctl reload crond.service

    2.2、crontab

    这里crontab分为 /usr/bin/crontab/etc/crontab

    • /usr/bin/crontab
      /usr/bin/crontab是可执行的二进制文件,可直接用来配置指定用户的crond定时任务
      命令:/usr/bin/crontab 选项
      –选项说明:
      -u 定义要操作的用户,不指定-u时默认当前用户
      -e 编辑用户的cron定时服务
      -l 显示用户的cron定时服务
      -r 删除用户的cron定时服务

    问题:为什么普通用户可以直接通过/usr/bin/crontab配置crond定时任务?

    通过ll /usr/bin/crontab 可以看到/usr/bin/crontab文件归属是root用户,但是文件权限位含有s,权限文位+s的二进制文件属于是管道文件即普通用户也可执行该二进制文件,但是执行后产生的进程属于归属用户,这里归属用户为root

    在这里插入图片描述
    通过/usr/bin/crontab配置crond定时任务,可直接使用普通用户,如nginx用户执行crontab -u nginx -ecrontab -e
    再编辑示例为内容并保存:
    0 0 * * * /bin/sh /usr/nginx/nginx/tools/clearNginxLog.sh
    – 示例内容说明
    0 0 * * *表达式表示每天整点会执行后面的指令,编辑内容保存后的定时配置生成在/var/spool/cron(一般默认只有root用户有权限查看)目录下
    每个用户对应一个文件,比如nginx用户对应/var/spool/cron/nginxtomcat用户对应/var/spool/cron/tomcat
    在这里插入图片描述

    • /etc/crontab
      /etc/crontabcrond定时任务的全局配置文件,可一次性配置多个用户的多个定时任务
      /etc/crontab文件方式归属权限为root用户,因此只能使用root用户才有权限编辑配置
      编辑内容vi /etc/crontab,如下图:
      在这里插入图片描述
      所标记的配置内容格式依次为: cron表达式 使用哪个用户执行 要执行的命令
      crond服务后台进程每分钟加载时,会加载到/etc/crontab中配置的这些指令, 同样会将内容指令保存在/var/spool/cron目录下对应的用户文件中。

    2.3、anacron

    • anacron需要依赖crond服务来实现,可以通过ps -ef|grep anacron看到并没有后台守护进程
      在这里插入图片描述
    • anacron服务通过/etc/anacrontab进行配置

    2.4、 anacrontab

    • anacrontab指的是/etc/anacrontab文件,用来配置anacron服务的全局定时任务
    • 只用root用户配置定时任务,编辑内容 vi /etc/anacrontab
      在这里插入图片描述
    • /etc/anacrontab加载过程
      crond服务每分钟加载时,会加载到/etc/anacrontab中配置的日方案周方案月方案对应的定时任务指令
    • 日方案定时任务为例说明
      • 主入口 nice run-parts /etc/cron.daily 表示会加载/etc/cron.daily目录下的可执行文件并执行
    • 首先会加载到/etc/cron.daily/logrotate并执行
    • 执行/etc/cron.daily/logrotate时会加载到文件中指定的/etc/logrotate.conf主配置文件
    • 主配置文件/etc/logrotate.conf中又include包含了外部/etc/logrotate.d目录下的所有子配置文件
    • 可以看到/etc/logroate.d目录下,存放的是Linux相关用户的日志管理指令文件,例如nginx用户的日志清理及备份指令文件等。
      在这里插入图片描述

    三、重要文件及目录说明

    脚本或文件或目录说明
    /usr/sbin/crondcrond服务的二进制文件
    /usr/bin/crontab用户级别的crond定时服务,二进制文件,权限为-rwsr-xr-x,其中s表示权限位,放在用户位置,表示进程归属执行的用户
    /etc/crontab系统级别的crond定时服务,普通文件,crond服务的计划任务配置文件
    /etc/var/spool/cron//usr/bin/crontab -e编辑的用户配置自动生成存放路径,如/etc/var/spool/cron/nginx
    /etc/cron.d/crond服务每分钟会加载该目录下所有文件,并识别文件中的可执行命令
    /etc/cron.d/0hourly每分钟会被crond服务加载到该文件,并识别文件中的定时命令01 * * * * root run-parts /etc/cron.hourly,表示每小时01分时会加载并执行/etc/cron.hourly目录下所有可执行文件
    /etc/cron.hourly/0anacron0hourly被执行时,脚本文件0anacron也会被加载到并执行,0anacron脚本中会加载/var/spool/anacron/cron.daily中的日期与当前日期对比,不一致则执行命令/usr/sbin/anacron -s开启anacron进程,可ps -ef|grep anacron查看
    /usr/sbin/anacronanacron服务的二进制文件
    /var/spool/anacron/cron.dailyanacron服务的执行日期记录文件
    /etc/anacrontab系统级别的anacron定时服务,普通文件,配置计划任务,当anacron进程启动时,会加载该配置文件,执行计划任务的最小单位是天数,到指定日期后,先强制延迟M分钟,再随机延迟N分钟,总共延迟M+N分钟后才执行command命令
    /etc/cron.daily/logrotate/etc/anacrontab文件中的command命令run-parts /etc/cron.daily,会执行/etc/cron.daily下所有可执行文件,包括/etc/cron.daily/logrotate
    /usr/sbin/logrotate文件/etc/cron.daily/logrotate中会使用到该命令执行计划任务/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
    /var/lib/logrotate/logrotate.status相关文件状态记录文件
    /etc/logrotate.conflogrotate的主配置文件,文件中会配置默认的日志分割方案,同时会include /etc/logrotate.d表示会加载/etc/logrotate.d/下所有子配置文件内容
    /etc/logrotate.d/logrotate子配置文件,用来自定义日志分割配置方案,不同应用单独文件配置,增强可读性,同时会覆盖/etc/logrotate.conf主配置文件中相同的配置,例如常用应用/etc/logrotate/nginx/etc/logrotate/tomcat等子配置
    /var/spool/mail/nginx记录日志到指定邮箱nginx,表示/usr/sbin/logrotate指定选项-m时,如/usr/sbin/logrotate -m nginx

    三、定时服务实现示例

    3.1、crond + logrotate实现nginx日志清理及备份

    参考我的这篇博文Linux crontab + logrotate实现日志自动清理及备份

    3.2、crond + shell脚本实现nginx日志清理及备份

    参考我的这篇博文nginx–自定义shell脚本实现日志自动清理、分割及压缩备份

    cs