概述
本章,您将学习 GNU/Linux 中的计划任务。
任务的调度由 cron
实用程序进行管理,它允许定期执行任务。该工具通常保留给管理员执行系统任务,但普通用户也可用它来运行自己有权限访问的任务或脚本。要管理用户的计划任务,我们需要使用 cron
实用工具中的 crontab
命令。
cron
服务由内存中的 crond
守护进程来运行,因此我们需要查看 crond
的状态并让其保持开机自启:
# 查看 crond 守护进程的状态
Shell > systemctl status crond.service
# 若未启动,则可以手动启动 crond
Shell > systemctl start crond.service
# 让 crond 开机自启动
Shell > systemctl enable crond.service
Shell > systemctl is-enabled crond.service
enabled
cron 服务的权限文件
要执行相应用户的计划任务,用户必须具有使用 cron
服务的权限。此权限因以下文件中包含的信息而异:
/etc/cron.allow
/etc/cron.deny
cron
。/etc/cron.allow
仅允许此文件中包含的用户使用 cron
。
如果它存在并且为空,则任何用户都不能使用 cron
。
cron.allow
文件,则 cron.deny
文件将被 忽略。/etc/cron.deny
此文件中的用户不允许使用 cron
。
如果此文件的内容为空,则 所有用户 都可以使用 cron
。
默认情况下,/etc/cron.deny
文件存在但为空,而 /etc/cron.allow
文件不存在。当两个文件同时存在时,系统仅使用 cron.allow
的文件内容作为判断依据并完全忽略 cron.deny
文件的存在,换言之,如果 /etc/cron.deny
和 /etc/cron.allow
中同时存在相同的用户,则相应用户可以正常使用 cron。
计划任务
当给用户设置计划任务时,会在 /var/spool/cron/
下创建一个以该用户命名的文件。
该文件包含 crond
运行该用户创建的计划任务所需的全部信息,包括待执行的命令或程序以及运行它们的时间表(时、分、日等)。 请注意,crond
可以识别的最小时间单位是 1 分钟。 在 RDBMS(如 MySQL )中也有类似的计划任务,其中基于时间的计划任务被称为 "事件调度器"(其支持最小的时间单位为 1 秒),基于事件的计划任务称为 "触发器"。
crontab
命令
crontab
命令用于管理计划任务文件。
该命令的用法为:
crontab [option(s)]
常用选项:
-e
– 使用 vi 编辑计划任务文件-l
– 显示计划任务文件的内容-u <user>
– 指定单个用户进行操作。只有root
才能使用-u <user>
选项来管理其他用户的计划任务文件-r
– 删除计划任务文件
不使用任何选项的 crontab
命令会删除旧的计划任务文件并且等待用户输入新行,您必须按 ctrl + d 键才能退出此编辑模式。
计划任务文件的内容
计划任务文件的结构遵循以下规则:
- 此文件的每一行都对应一项计划任务;
- 每行包含6个字段:5个时间设定字段 + 1个命令指令字段;
- 字段间需用空格或制表符分隔;
- 每行必须以回车符结束;
- 行首的
#
号将注释该行内容。
例如,我需要对 root 用户设置一项计划任务:
Shell(root) > crontab -e
10 4 1 * * /root/scripts/backup.sh
↓ ↓ ↓ ↓ ↓ ↓
1 2 3 4 5 6
说明:
字段 | 说明 | 值 |
---|---|---|
1 | 分钟 | 0 至 59 |
2 | 小时 | 0 至 23 |
3 | 月份中的某一日 | 1 至 31 |
4 | 年中的某一月 | 1 至 12 |
5 | 星期几 | 0 至 7,其中 0 和 7 都表示星期日 |
6 | 要执行的命令或脚本 | 脚本或目录应该使用绝对路径且配置输出重定向 |
我们还可以使用一些特殊符号来定义时间:
特殊符号 | 说明 |
---|---|
* |
表示字段的所有时间值 |
- |
表示连续的时间范围 |
, |
表示不连续的时间范围 |
/ |
表示时间间隔 |
示例:
脚本于4月15日上午10:25执行:
25 10 15 04 * /root/scripts/script.sh &>> /var/log/custom-script.log
每天上午11点和下午4点运行一次任务:
00 11,16 * * * /root/scripts/script.sh &>> /var/log/custom-script.log
该任务每天上午11点至下午4点每小时运行一次:
00 11-16 * * * /root/scripts/script.sh &>> /var/log/custom-script.log
工作日的工作时间每10分钟运行一次:
*/10 9-17 * * 1-5 /root/scripts/script.sh &>> /var/log/custom-script.log
对于 root 用户, crontab
也有一些特殊的时间设置:
设置 | 说明 |
---|---|
@reboot | 在系统重新启动时运行命令 |
@hourly | 每小时运行一次命令 |
@daily | 每天午夜后运行 |
@weekly | 每周日午夜后运行命令 |
@monthly | 在每月的第一天午夜后运行命令 |
@annually | 1月1日午夜后运行 |
任务执行过程
用户 rockstar 想要编辑他的 crontab
文件:
-
crond
需要检查他是否被授权(依据/etc/cron.allow
和/etc/cron.deny
)。 -
若授权通过,用户可访问其专属的
crontab
文件(/var/spool/cron/rockstar
)。
crond
守护进程:
- 读取 – 每分钟读取所有用户的计划任务文件。
- 运行 – 根据计划运行任务。
- 写入 – 将相应的事件和消息写入到文件中(
/var/log/cron
)。
