任务管理¶
在本章中,您将学习如何管理计划任务。
目标:在本章中,未来的 Linux 管理员将学会如何
Linux 处理任务调度;
限制
cron
的使用权限给特定用户;
调度任务。
crontab, crond, 调度, linux
知识:
复杂度:
阅读时间: 15 分钟
概述¶
任务的调度由 cron
工具管理。它允许任务的周期性执行。
它保留给管理员用于执行系统任务,但普通用户也可以用于他们有权限的任务或脚本。要访问 cron
工具,我们使用:crontab
。
cron
服务用于
- 重复性管理操作;
- 备份;
- 系统活动监控;
- 程序执行。
crontab
是 cron table 的缩写,但可以理解为任务调度表。
警告
要设置计划,系统必须设置正确的时间。
服务工作原理¶
内存中存在一个 crond
守护进程,它运行 cron
服务。
检查其状态
[root] # systemctl status crond
技巧
如果 crond
守护进程未运行,您将需要手动初始化它,并/或在启动时自动初始化。实际上,即使任务已计划,它们也不会被启动。
手动初始化 crond
守护进程
[root]# systemctl {status|start|restart|stop} crond
启动时初始化 crond
守护进程
[root]# systemctl enable crond
安全性¶
要实现计划,用户必须具有使用 cron
服务的权限。
此权限因以下文件中的信息而异
/etc/cron.allow
/etc/cron.deny
警告
如果任一文件不存在,所有用户都可以使用 cron
。
cron.allow 和 cron.deny 文件¶
/etc/cron.allow 文件
只有此文件中的用户才被允许使用 cron
。
如果它存在且为空,则任何用户都不能使用 cron
。
警告
如果存在 cron.allow
,则 cron.deny
被 **忽略**。
/etc/cron.deny 文件
此文件中的用户不允许使用 cron
。
如果它为空,则所有用户都可以使用 cron
。
默认情况下,/etc/cron.deny
存在且为空,而 /etc/cron.allow
不存在。当两个文件同时存在时,系统仅以 cron.allow
的内容为判断依据,并完全忽略 cron.deny
文件的存在。
允许用户¶
只有 **user1** 能够使用 cron
。
[root]# vi /etc/cron.allow
user1
禁止用户¶
只有 **user2** 不能使用 cron
。请注意,/etc/cron.allow
文件不能存在。
[root]# vi /etc/cron.deny
user2
如果同一用户同时存在于 /etc/cron.deny
和 /etc/cron.allow
中,则该用户可以正常使用 cron。
调度任务¶
当用户调度任务时,会在 /var/spool/cron/
下创建一个以其用户名为名的文件。
此文件包含 crond
需要了解的关于该用户创建的任务的所有信息,包括要运行的命令或程序,以及运行它们的计划(小时、分钟、天等)。请注意,crond
能够识别的最小时间单位是 1 分钟。在 RDBMS(如 MySQL)中也有类似的调度任务,基于时间的调度任务称为“事件调度器”(可识别的时间单位为 1 秒),而基于事件的调度任务称为“触发器”。
crontab 命令¶
crontab
命令用于管理计划文件。
crontab [-u user] [-e | -l | -r]
示例
[root]# crontab -u user1 -e
选项 | 描述 |
---|---|
-e |
使用 vi 编辑计划文件 |
-l |
显示计划文件的内容 |
-u <user> |
指定一个用户进行操作 |
-r |
删除计划文件 |
警告
不带选项的 crontab
会删除旧的计划文件,并等待用户输入新行。您必须按 Ctrl + D 退出此编辑模式。
只有 root
用户可以使用 -u <user>
选项来管理其他用户的计划文件。
上面的示例允许 root 用户为 user1 安排任务。
crontab 的用途¶
crontab
的用途很多,包括
- 对
crontab
文件的修改会立即生效; - 无需重启。
另一方面,必须考虑以下几点
- 程序必须是自主的;
- 提供重定向(stdin、stdout、stderr);
- 运行需要终端输入/输出请求的命令是不相关的。
注意
重要的是要理解,调度的目的是自动执行任务,无需外部干预。
crontab 文件¶
crontab
文件按照以下规则结构化。
- 该文件的每一行对应一个计划;
- 每一行有六个字段,5 个用于时间,1 个用于命令;
- 空格或制表符分隔每个字段;
- 每一行以回车符结束;
- 行首的
#
会注释掉该行。
[root]# crontab –e
10 4 1 * * /root/scripts/backup.sh
1 2 3 4 5 6
字段 | 描述 | 详情 |
---|---|---|
1 | 分钟(s) | 从 0 到 59 |
2 | 小时(s) | 从 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 > /log/…
每天上午 11 点和下午 4 点运行一次任务
00 11,16 * * * /root/scripts/script > /log/…
该任务每天上午 11 点到下午 4 点之间每小时运行一次
00 11-16 * * * /root/scripts/script > /log/…
工作日的上午 11 点到下午 4 点之间每 10 分钟运行一次
*/10 8-17 * * 1-5 /root/scripts/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
)文件。