跳至内容

任务管理

在本章中,您将学习如何管理计划任务。


目标:在本章中,未来的 Linux 管理员将学会如何

✔ Linux 处理任务调度;
✔ 限制 cron 的使用权限给特定用户;
✔ 调度任务。

🏁 crontab, crond, 调度, linux

知识⭐ ⭐
复杂度⭐ ⭐

阅读时间: 15 分钟


概述

任务的调度由 cron 工具管理。它允许任务的周期性执行。

它保留给管理员用于执行系统任务,但普通用户也可以用于他们有权限的任务或脚本。要访问 cron 工具,我们使用:crontab

cron 服务用于

  • 重复性管理操作;
  • 备份;
  • 系统活动监控;
  • 程序执行。

crontabcron 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 秒),而基于事件的调度任务称为“触发器”。

Cron tree

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 文件

  1. crond 守护进程检查用户是否被允许(/etc/cron.allow/etc/cron.deny)。

  2. 如果用户被允许,他们就可以访问他们的 crontab 文件(/var/spool/cron/rockstar)。

crond 守护进程

  • 读取 - 每分钟读取所有用户的计划任务文件。
  • 运行 - 根据计划运行任务。
  • 写入 - 将相应的事件和消息写入(/var/log/cron)文件。