Linux-- 定时服务crond VS anacron和 crontab VS anacrontab区别对比

举报
吾日三省贾斯汀 发表于 2021/09/27 18:31:14 2021/09/27
【摘要】 学习背景==> 一般实际的项目中多多少少都可能会涉及到定时任务的场景,比如定时`nginx日志清理及备份`、`tomcat日志滚动`、`MySQL数据库自动备份`、`批量解析数据文件导入导出`等等,定时任务执行的对象可能是`shell脚本`等指令文件。而定时任务的实现,在Java工程当中,可以通过`Spring Quartz`配置定时任务,在Linux服务器可以通过自带的`crond`服务配...

学习背景
==
> 一般实际的项目中多多少少都可能会涉及到定时任务的场景,比如定时`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`
![在这里插入图片描述](https://img-blog.csdnimg.cn/b924150ce8774ed0813c04264193f07a.png)
`running`表示运行状态~

* 查看`crond`服务后台进程 
`ps -ef|grep crond`
![在这里插入图片描述](https://img-blog.csdnimg.cn/f45462f6ea9e4d998def4f5572317d64.png)
可以看到`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` 

![在这里插入图片描述](https://img-blog.csdnimg.cn/07bdbade05ed46dd8ca3579c7de0910c.png)
通过`/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`
![在这里插入图片描述](https://img-blog.csdnimg.cn/024faddc5c52442eb619ebfb802482c5.png)


* `/etc/crontab`
`/etc/crontab`是`crond`定时任务的全局配置文件,可一次性配置多个用户的多个定时任务
`/etc/crontab`文件方式归属权限为`root`用户,因此只能使用`root`用户才有权限编辑配置
编辑内容`vi /etc/crontab`,如下图:
![在这里插入图片描述](https://img-blog.csdnimg.cn/38439c70d5794023bd8c8748a7e012a7.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0p1c3RpblFpbg==,size_16,color_FFFFFF,t_70)
所标记的配置内容格式依次为: `cron表达式` `使用哪个用户执行` `要执行的命令`
`crond`服务后台进程每分钟加载时,会加载到`/etc/crontab`中配置的这些指令, 同样会将内容指令保存在`/var/spool/cron`目录下对应的用户文件中。

2.3、anacron
--
* `anacron`需要依赖`crond`服务来实现,可以通过`ps -ef|grep anacron`看到并没有后台守护进程
![在这里插入图片描述](https://img-blog.csdnimg.cn/b51b2168250941d3993a80131d9abdae.png)
* `anacron`服务通过`/etc/anacrontab`进行配置

2.4、 anacrontab
--
* `anacrontab`指的是`/etc/anacrontab`文件,用来配置`anacron`服务的全局定时任务
* 只用`root`用户配置定时任务,编辑内容 `vi /etc/anacrontab`
![在这里插入图片描述](https://img-blog.csdnimg.cn/089c8303c88746bb9dc9bda21fc7437f.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0p1c3RpblFpbg==,size_16,color_FFFFFF,t_70)
* `/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`用户的日志清理及备份指令文件等。
![在这里插入图片描述](https://img-blog.csdnimg.cn/122a8665e2614c92997d3672ecc3d82c.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0p1c3RpblFpbg==,size_16,color_FFFFFF,t_70)


三、重要文件及目录说明
==
| 脚本或文件或目录 |说明  |
|--|--|
| `/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脚本实现日志自动清理、分割及压缩备份](https://blog.csdn.net/JustinQin/article/details/119356597)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。