GNU/Linux基础 — 计划任务

概述

本章,您将学习 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 文件:

  1. crond 需要检查他是否被授权(依据 /etc/cron.allow/etc/cron.deny )。
  2. 若授权通过,用户可访问其专属的 crontab 文件(/var/spool/cron/rockstar)。

crond 守护进程:

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

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci",Github - https://github.com/jimcat8
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇