@
前言
我们之前了解到,在 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分钟执行一次动作 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构