简介
在 Linux 中,自动执行重复性任务对于系统维护非常重要。无论是每天运行备份、清理临时文件,还是每周生成报告,这些任务都由名为 Cron 的系统工具处理。
Cron 是一种严格基于时间的作业调度器。它依靠特定的配置语法,准确确定命令的运行时间。这个配置表通常称为「crontab」。
Cron 数十年来一直是 Unix 文化的一部分。在现代工作流平台和云调度器出现之前很久,管理员就依靠 cron 在预定时间运行备份、清理任务、报告和维护任务。
刚开始看到类似 0 2 * * * 的 crontab 条目时,可能会感到困惑。在本实验中,你将学习如何理解和编写这种语法。你将完成以下任务:
- 查看系统 crontab:查看全局 cron 配置文件。
- 解析语法:理解其中 5 个时间和日期字段。
- 编写计划:为每天运行的任务构造有效的 cron 表达式。
查看系统 Cron 表
理解 cron 语法的一种快捷方法是查看系统级配置文件 /etc/crontab。该文件通常包含一个有助于理解字段布局的文件头说明。
这个文件既是真实的配置文件,也可以作为学习参考。许多 Linux 系统会在其中加入注释,因为 cron 语法简洁而强大;在理解字段顺序之前,也很容易误读它。
运行以下命令查看该文件:
cat /etc/crontab
在输出中找到 Example of job definition 部分(不同发行版中的行可能略有差异):
## .---------------- minute (0 - 59)
## | .------------- hour (0 - 23)
## | | .---------- day of month (1 - 31)
## | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
## | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
## | | | | |
## * * * * * user-name command to be executed
该图表说明,每个 cron 计划都由 5 个字段和要运行的命令组成:
- 分钟(0-59)
- 小时(0-23,24 小时制)
- 月份中的日期(1-31)
- 月份(1-12)
- 星期几(0-7,其中 0 和 7 都表示星期日)
星号 * 是通配符,表示「每一个」或「每次」。例如,在「月份」字段中使用 *,表示「每个月」。
Cron 表达式很简洁,因为每个字段都会缩小计划的匹配范围。所有字段组合起来,就能表示一个重复发生的时间点。尽早养成从左到右按「分钟、小时、日期、月份、星期几」读取字段的习惯,这一点非常重要。
例如:17 * * * * 表示「每小时的第 17 分钟、每天都运行」。
准备语法文件
现在你已经了解了字段结构,接下来练习编写一个条目。
我们将创建一个文本文件,用于编写 cron 表达式草稿。在将表达式添加到实际的系统调度器之前,先这样练习是一个好方法。
这一步很重要,因为 cron 条目虽然只是普通文本,但安装后会产生实际影响。单独编写表达式,可以让你在将其变成自动化任务之前先确认计划安排。
确保当前位于项目目录:
cd ~/project
创建一个名为 cron_syntax.txt 的空文件:
touch cron_syntax.txt
确认文件已创建:
ls -l cron_syntax.txt
编写每日计划语法
你的任务是构造一个 cron 表达式,使任务能够「每天凌晨 2:00 运行」。
我们来分解这一要求对应的 5 个字段:
- 分钟:我们需要正好在 2:00 运行,也就是第 0 分钟。值为:
0。 - 小时:我们需要凌晨 2 点运行(24 小时制)。值为:
2。 - 月份中的日期:我们希望它在每月的每天运行。值为:
*。 - 月份:我们希望它在每年的每个月运行。值为:
*。 - 星期几:无论当天是星期几,我们都希望它运行。值为:
*。
将这些字段组合起来,表达式就是:0 2 * * *。
将此语法追加到文件中:
echo "0 2 * * *" >> cron_syntax.txt
检查写入的条目:
cat cron_syntax.txt
语法 0 2 * * * 告诉系统:「当分钟为 0 且小时为 2 时,运行命令。」
请记住这个理解方式:cron 会将当前时间与 5 个字段逐一匹配。当当前时间符合该模式时,cron 就会启动这个作业。
总结
在本实验中,你学习了 cron 调度的基础知识:
- 系统配置:查看
/etc/crontab,了解标准字段布局。 - 字段结构:识别 5 个字段:分钟、小时、月份中的日期、月份和星期几。
- 编写表达式:成功为每日任务创建语法(
0 2 * * *)。
理解这种语法对于在 Linux 环境中自动执行各种常规任务至关重要。



