Linux-- 定时服务crond VS anacron和 crontab VS anacrontab区别对比
学习背景
一般实际的项目中多多少少都可能会涉及到定时任务的场景,比如定时
nginx日志清理及备份
、tomcat日志滚动
、MySQL数据库自动备份
、批量解析数据文件导入导出
等等,定时任务执行的对象可能是shell脚本
等指令文件。而定时任务的实现,在Java工程当中,可以通过Spring Quartz
配置定时任务,在Linux服务器可以通过自带的crond
服务配置定时任务,方式有很多种,本文主要介绍Linux服务自带的定时服务,有crond
、anacron
、crontab
、anacrontab
,这四种服务相互联系,但又有一定的区别。
进入正文~
一、crond VS anacron
crond
是Linux操作系统自带的定时服务,自带守护进程,一般用于运行计划任务如系统备份
、日志分割级清理
。crond
服务更适合在那些24x7不间断运行的机器如服务器上运行的计划任务。anacron
则是较新版Linux操作系统自带的定时服务,CentOS 6.0后系统会自带anacron
服务,没有守护进程,需要依赖crond
服务运行,也是常用于运行计划任务如系统备份
、日志分割级清理
。但anacron
服务比较适合用在一天内或一周内会重启的机器上运行的计划任务。
主要区别对比:
crond | anacron |
---|---|
有守护进程,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 -e
或 crontab -e
再编辑示例为内容并保存:
0 0 * * * /bin/sh /usr/nginx/nginx/tools/clearNginxLog.sh
– 示例内容说明
0 0 * * *
表达式表示每天整点会执行后面的指令,编辑内容保存后的定时配置生成在/var/spool/cron
(一般默认只有root
用户有权限查看)目录下
每个用户对应一个文件,比如nginx
用户对应/var/spool/cron/nginx
,tomcat
用户对应/var/spool/cron/tomcat
/etc/crontab
/etc/crontab
是crond
定时任务的全局配置文件,可一次性配置多个用户的多个定时任务
/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/crond |
crond服务的二进制文件 |
/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/0anacron |
当0hourly 被执行时,脚本文件0anacron 也会被加载到并执行,0anacron 脚本中会加载/var/spool/anacron/cron.daily 中的日期与当前日期对比,不一致则执行命令/usr/sbin/anacron -s 开启anacron进程,可ps -ef|grep anacron 查看 |
/usr/sbin/anacron |
anacron 服务的二进制文件 |
/var/spool/anacron/cron.daily |
anacron 服务的执行日期记录文件 |
/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.conf |
logrotate 的主配置文件,文件中会配置默认的日志分割方案,同时会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脚本实现日志自动清理、分割及压缩备份
- 点赞
- 收藏
- 关注作者
评论(0)