前提条件¶
- 一台运行Rocky Linux的计算机
- 知道如何使用您最喜欢的编辑器来修改命令行环境中的配置文件(这篇文章将使用
vi
)。 - 您已经了解了bash、 python 或其他脚本/编程工具的基础知识,并且想要自动运行脚本。
- 您已经通过 ssh 连接到您的机器(它可以是 root 用户或 UID 大于 1000 的普通用户)。
cron 简介¶
GNU/Linux提供 cron 系统,这是一个基于时间的 cron
自动化流程的作业程序。 它并不复杂,但却相当强大。 想要一个脚本或程序每天在 5 pm 运行? cron
可以做到。 cron
的不同分支(或变量),具有相同的功能。 在这个文档中,使用 cronie ,版本为 1.5.2。 你可以单击这里找到最后更新版本的日志。
cronie的描述¶
- cronie -包名, Rocky Linux 默认包含cronie;
- crontab -每个用户维护
crontab
(任务计划) 的命令; - crond.service -cronie 的守护进程,可以通过
systemctl start | restart | stop | status
来管理; - /etc/crontab -将cron 任务分配给不同的用户,通常我们更习惯于使用
crontab-e
。 例如,如果您目前是以 root 用户身份登录, 输入crontab -e
并在保存后您将在文件 /var/spool/cron/root 中看到特定的 cron 作业。 - /var/log/cron* - Cronie 的日志,默认情况下是日志会滚动更新,并以日期后缀结束。 末尾星号的意思是通配符, 指代的是不同的日期后缀。
- anacron - 是 cronie 的一部分. 关于
anacron
的更多信息,见 anacron - 自动命令。
crontab
命令¶
crontab
是安装cronie 软件包后获得的命令。 相比于 anacron
, 它更适合于每天工作7*24小时的服务器。 crontab
的常见选项是:
-e # 编辑定时任务
-l # 查看定时任务
-r # 删除当前用户所有 crontab 任务
使用 cronie¶
为了允许不同的用户在不同时间执行不同的命令(或脚本),他们可以写入这个文件。 然而,我们通常更习惯使用 crontab -e
。
shell > cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# 注意: 所有 # 开头的行都是注释说明, 可随意修改添加
# 默认 * 代表所有, 比如每一分钟/每一小时/每一天均执行命令
# 更多说明详见 man 4 crontabs
# 任务定义示例:
# .---------------- 指定分钟 (0-59)
# | .-------------- 指定小时 (0-23)
# | | .------------ 每月第几天 (1-31)
# | | | .---------- 指定月份 (1-12) 或月份前三个字母缩写 jan,feb,mar,apr ...
# | | | | . ------- 每周第几天(0-6) (周日=0 或 7) 或者 sun, mon, tue, wed, thu, fri, sat
# | | | | |
# * * * * * 要执行的用户名 要执行的命令
参数 | 含义 | 取值范围 |
---|---|---|
第一个* | 指定每小时的第几分钟执行命令 | 0-59 |
第二个* | 指定每天中的第几小时执行命令 | 0-23 |
第三个* | 指定每月中的哪一天执行命令 | 1-31 |
第四个* | 指定每年中的哪个月执行命令 | 1-12 |
第五个* | 指定每周中的哪一天执行命令 | 0-7(0和7均表示周日) |
在下面的示例中,假定您作为 root 用户执行此操作,请输入以下内容:
crontab -e
将显示 root 用户的定时任务。 如果使用vi
作为默认系统编辑器,按 I 键进入插入模式。- "#" 表示这是一行是备注, 任务执行时将跳过当前行。
# 晚上 10:00 进行系统备份
00 22 * * * /usr/local/sbin/backup
- 一旦输入了上述内容(再次假定
vi
是系统编辑器),按 Esc 退出插入模式。 - 按下组合键 Shift+:并输入wq!保存并退出您的文件(显示在编辑器底部)。
现在脚本将在每天 22:00 运行。 显然,这是一个非常简单的例子。 如果你需要更详细的内容,事情就会变得更加复杂。
注意
对于要按时运行的脚本文件, 需要先执行 (chmod +x
) 命令添加可执行权限, cronie 才能自动运行它。
复杂选项¶
迄今为止,讨论的内容是非常简单的选择,但是如何完成更复杂的定时任务?
# 假设你想要运行每10分钟备份脚本(可能不切实际,但它只是一个例子!) 且执行一整天。 为此目的, 以下将写入:
* /10 * * * * /usr/local/sbin/backup
# 如果你只想在星期一, 星期三和星期五每10分钟运行一个备份怎么办 ? 为此, 要这么写:
* /10 * * * 1,3,5 /usr/local/sbin/backup
# 除了星期六和星期天之外, 每天10分钟一次,如何备份?
* /10 * * * 1-5 /usr/local/sbin/backup
特殊符号 | 含义 |
---|---|
* | 代表任何时间。 例如,第一个 * 指任意分钟,第二个 * 是指任意小时 |
, | 代表非连续时间,例如 0 8,12,16 * * * , 这意味着命令将在每天 8:00、12:00 和 16:00 各执行一次 |
- | 代表一个连续的时间范围,例如 0 5 * * 1-6 , 这意味着一个命令将在星期一至星期六每天早上 5 点被执行 |
*/n | 表示执行间隔的频率,例如 */10 * * * * 表示每隔10分钟执行 |
注意
当前 cronie 能识别的最小时间单位是1分钟;例如,当使用 30 4 1,15 * 5 command
时,它将导致该命令在每月1日和15日且必须是周五的上午4:30运行;某些脚本或命令的输出信息将阻止执行定时任务,并且需要输出重定向,例如*/10 * * * * /usr/local/sbin/backup &> /dev/null
常见问答¶
- /etc/crontab 和
crontab -e
, 两种方法之间是否有任何差异?crontab-e
不需要指定用户 (默认情况下使用当前登录的用户), /etc/crontab需要指定用户。 - 如果指定的命令或脚本没有正确执行,我应该怎么办? 检查/var/log/cron* 文件,或使用
journalctl -u crond.service
来检查有关守护进程的信息,查看脚本是否有 x 可执行权限等排除故障。 - 除了 cronie,还有什么样的 cron 变体? fcron , 最新版本是 3.3.0 (dev, 2016-08-14)。 cronsun, 最新版本 0.3.5 (2018-11-20).
总结¶
对Rocky Linux桌面用户或系统管理员来说,cronie 是一个非常强大的工具。 它可以允许您自动执行任务和脚本,这样您就不必记住手动运行它们了。 虽然基本知识很简单,但实际任务可能很复杂。 关于 crontab
的更多信息,查看 crontab man 页面。 您也可以简单地在互联网上搜索"crontab"。 这将为您提供大量的搜索结果,并帮助您提高crontab
表达式的优化能力。
Author: tianci li
Contributors: Steven Spencer, Ganna Zhyrnova