跳转至

前提条件

  • 一台运行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

常见问答

  1. /etc/crontab 和 crontab -e , 两种方法之间是否有任何差异? crontab-e 不需要指定用户 (默认情况下使用当前登录的用户), /etc/crontab需要指定用户。
  2. 如果指定的命令或脚本没有正确执行,我应该怎么办? 检查/var/log/cron* 文件,或使用 journalctl -u crond.service 来检查有关守护进程的信息,查看脚本是否有 x 可执行权限等排除故障。
  3. 除了 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