@

前言

我们之前了解到,在 Linux 和 Unix 系统中,at 命令能够帮助我们设置一次性定时任务,以便在未来的某个时间点执行指定的操作。然而,许多任务需要定期自动执行,而不仅仅是单次安排。本篇文章将介绍 crontab 命令,通过它我们可以轻松实现各种周期性任务的自动化,有效提升系统管理的效率。

crontab 的概念与定义

crontab 是 Unix 类操作系统(如 Linux)中的一种名为cron(周期性任务调度机制)的配置文件。crontab 文件允许用户定义周期性运行的命令或脚本。

crond 与 crontab 的关系

  • crond:是一个系统级的后台进程,负责根据 crontab 文件中的时间表,周期性地运行用户定义的任务。它始终在后台运行并每分钟检查任务是否需要执行。
  • crontab:是用户用于定义计划任务的配置文件,包含命令和任务执行的时间表。每个用户,包括系统用户,都可以拥有一个 crontab 文件。

因此,要执行crontab命令需要crond服务的支持。

crond服务的安装与管理

  • 在安装完成操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的,若需要安装则执行如下命令:
yum  install  crontabs #安装,注意包名

开启 crond 服务

sudo systemctl start crond #立即启动 `crond` 服务sudo systemctl enable crond #设置 `crond` 服务开机自启sudo systemctl enable --now crond #设置开机自启同时启动

关闭 crond 服务

sudo systemctl stop crond #立即停止 `crond` 服务sudo systemctl disable crond #取消 `crond` 服务的开机自启sudo systemctl disable --now crond #取消开机自启同时停止

查看 crond服务的状态

sudo systemctl status  crond   #该命令会显示 crond 服务当前的运行状态以及是否已启用开机自启

重启 crond 服务

  • 如果修改了某些计划任务文件,并希望立即应用修改,可以重启 crond 服务
sudo systemctl restart crond #重启 crond 服务

注意:系统版本

上述命令适用于大多数使用 systemd 作为初始化系统的 Linux 发行版(如 CentOS 7、RHEL 7、Ubuntu 等)。如果使用的是较老的系统(如 CentOS 6、RHEL 6 等),可以使用 service 命令管理 crond 服务。

任务调度的分类

  • 在 Linux 操作系统中,任务调度通常分:
    • 系统任务调度 :由系统管理员配置和管理,用于执行系统级别的定时任务,通常涉及系统维护和全局管理,通常存储在 /etc/crontab/etc/cron.d/ 等目录中。
    • 用户任务调度 :由普通用户自行管理,用于个人需求的定时任务,不影响系统全局环境,通常存储在 /var/spool/cron/crontabs/<用户名>/var/spool/cron/<用户名>
  • 这两种调度方式都依赖于 cron 系统守护进程,但它们的作用范围和使用场景不同

1. 系统任务调度

系统任务调度 主要用于管理系统级别的定时任务,通常是操作系统或系统管理员配置的,用于定期执行系统维护、更新、备份、安全检查等操作。系统任务调度的 crontab 文件通常由系统用户(如 root)来维护。

系统任务调度的特点:

  • 文件位置:系统级别的 crontab 文件通常位于 /etc/crontab/etc/cron.d/ 目录中。
  • 管理权限:只有系统管理员(如 root 用户)或者具有相应权限的用户可以编辑这些文件。
  • 任务类型:包括系统备份、清理日志、同步时间、检查系统状态、应用补丁等。
  • 执行用户:可以通过 crontab 文件中指定的用户身份来执行特定的任务。

系统 crontab 文件格式

与用户的 crontab 不同,系统 crontab 文件多了一个字段用于指定执行任务的用户。例如,/etc/crontab 的格式如下:

分钟 小时 日期 月份 星期 用户 命令

例如,/etc/crontab 文件中的一行可能是:

0 2 * * * root /usr/local/bin/backup.sh #每天凌晨 2 点,`root` 用户将执行 `/usr/local/bin/backup.sh` 脚本

系统任务调度的文件和目录:

  • /etc/crontab:系统级 crontab 文件,用于定义系统范围内的任务。
  • /etc/cron.d/:该目录可以存放多个 crontab 文件,便于管理不同的系统任务。
  • /etc/cron.daily//etc/cron.hourly//etc/cron.weekly//etc/cron.monthly/:这些目录分别用于存放需要每日、每小时、每周或每月执行的脚本文件。系统会根据相应时间间隔自动执行这些目录下的任务。

系统任务调度的应用场景:

  • 定期检查系统更新。
  • 每天清理临时文件。
  • 每月备份重要系统文件。
  • 定期监控系统性能和状态。

2. 用户任务调度

用户任务调度 允许普通用户(非 root 用户)根据自己的需求定义定时任务,这些任务只会影响该用户的环境,不会影响整个系统。用户任务调度可以通过 crontab 命令来设置。

用户任务调度的特点:

  • 管理权限:每个用户都可以创建和管理自己的 crontab 任务,无需 root 权限。
  • 任务类型:用户级别的任务通常包括备份个人数据、自动化处理文件、运行定时脚本或定期提醒等。
  • 文件位置:每个用户的 crontab 任务存储在系统的 /var/spool/cron/crontabs/ 目录下,文件名通常为用户的用户名。
  • 任务范围:这些任务仅在该用户的权限范围内运行。

用户 crontab 文件格式

与系统 crontab 不同,用户的 crontab 文件中不需要指定用户身份,只包含五个时间字段和命令部分。例如:

0 3 * * * /home/user/backup.sh #表示用户定义的任务,每天凌晨 3 点执行 `backup.sh` 脚本

用户任务调度的文件和命令:

  • crontab -e:编辑当前用户的 crontab 文件,添加或修改定时任务。
  • crontab -l:列出当前用户的所有 crontab 任务。
  • crontab -r:删除当前用户的所有 crontab 任务。
  • 任务文件位置:用户的 crontab 文件通常存储在 /var/spool/cron/crontabs/<用户名>。(某些系统为 /var/spool/cron/

用户任务调度的应用场景:

  • 定期备份个人数据(如文档、邮件等)。
  • 定时同步本地数据到云端。
  • 每天或每周运行某个数据处理脚本。
  • 自动执行系统提醒,定时发送邮件。

crontab命令详解

crontab工作过程—权限控制机制

  • 当系统中有 /etc/cron.allow 文件时,只有写入此文件的用户可以使用 crontab 命令,没有写入的用户不能使用 crontab 命令。同样,如果有此文件,/etc/cron.deny 文件会被忽略,因为 /etc/cron.allow 文件的优先级更高
  • 当系统中只有 /etc/cron.deny 文件时,写入此文件的用户不能使用 crontab 命令,没有写入文件的用户可以使用 crontab 命令
  • crontab 执行的每一项工作都会被 记录到 /var/log/cron 这个日志文件中
  • 当用户使用 crontab 新建工作之后,该项工作就会被记录到 /var/spool/cron/目录里面

crontab命令格式

crontab  [-u  user]  [-l | -r | -e]

crontab命令参数

参数 解释 示例
-l list 查看定时任务 crontab -l
-e edit 编辑定时任务,建议手动编辑 crontab -e
-i 删除定时任务,提示用户确认删除,避免出错 crontab -i
-r 删除定时任务,移除/var/spool/cron/username文件 crontab -r
-u user 指定用户执行任务,root 可以管理普通用户计划任务 crontab -u redhat -l

执行crontab 命令就是在修改 /var/spool/cron 中的定时任务文件

编辑crontab

  • 格式:
[root@server ~]# crontab  -e
  • 写入的命令格式:每一行书写一个工作,每个工作共有6个字段
代表意义 分钟 小时 日期 月份 星期 命令
数字范围 0-59 0-23 1-31 1-12 0-7(0和7表示周日) 执行的动作
*    *    *    *    *   command
┬    ┬    ┬    ┬    ┬
│    │    │    │    │
│    │    │    │    └─── 一周中的第几天 (0 - 7) (0 或 7 表示周日)│    │    │    └─────── 月份 (1 - 12)│    │    └──────────── 日期 (1 - 31)│    └───────────────── 小时 (0 - 23)└────────────────────── 分钟 (0 - 59)

特殊字符

特使字符 含义
* 任意时刻
- 表示时间范围
,(逗号) 分割时段
*/n 指定时间间隔的频率,如:每3分钟执行一次,*/3

示例

时间 含义
1 2 * * * 每天凌晨2点零1分执行动作
0 17 * * 1 每周一下午17点整执行动作
0 5 1,15 * * 每月的1号和15号凌晨5点执行动作
40 4 * * 1-5 每周1到周5的凌晨4点40分执行动作
/10 4 * * 每天凌晨4点每隔10分钟执行动作
3,15 8-11/2 * * * 每天8点和10点的,第3和第15分钟才会执行
* * * * * 每隔1分钟执行一次动作