Linux 中的 Crontab – 带有实时示例和工具

目录

让我们一起深入了解一下 crontab,包括它的命令以及与之相关的各种操作技巧。

本文将指导你如何利用 cron 工具安排任务,并且还会介绍一些在线工具,帮助你格式化和测试 cron 命令。

起源

“crontab”是“cron table”的缩写。“cron”这个词来源于希腊语“Chronos”,意为时间。Crontab 是一个系统守护进程,能够按照预定的时间自动执行一系列任务和作业。

应用场景

Crontab 的应用非常广泛,例如:自动备份数据、轮换日志文件、在不同服务器之间同步文件以及清理临时文件夹等。虽然它可以用于任何类型的工作,但在系统管理领域尤其重要。

借助 cron,管理员可以精确地在特定的日期和时间运行作业。

接下来,我们将学习如何配置它。

crontab 语法

cron 工具通过读取配置文件来执行命令。为了解析 crontab 配置文件中的每一行,它遵循特定的语法规则。Crontab 的每一行由六个字段构成。前五个字段(1-5)定义了作业的执行时间和日期。第六个字段则是要执行的用户名和/或任务/作业/命令/脚本。

* * * * * USER_NAME 命令/脚本执行

│ │ │ │ │
│ │ │ │ │
│ │ │ │ |_________ 星期几(0-6,0 表示星期日,也可以使用名称)
│ │ │ |____________ 月份 (1-12),* 表示每个月
│ │ |______________ 日期 (1-31),* 表示每一天
│ |________________ 小时 (0-23),* 表示每小时
|___________________ 分钟 (0-59),* 表示每分钟

注意:

  • 星号 *
  • 表示匹配该字段的所有可能值。例如,小时字段中的星号表示每小时,月份字段中的星号表示每个月。

用户名是可选的(仅在系统 crontab 文件中可用)

示例:

为了更好地理解上述语法,我们来看一些例子:

0 5 * * * /scripts/job.sh

1. 设定一个 cron 任务,在每天早上 5 点执行。

0 6,18 * * * /scripts/job.sh

2. 设定一个 cron 任务,在每天早上 6 点和下午 6 点执行两次。

* * * * * /scripts/job.sh

3. 设定一个 cron 任务,每分钟执行一次。

0 19 * * mon /scripts/job.sh

4. 设定一个 cron 任务,在每周一晚上 7 点执行。

*/10 * * * * /scripts/job.sh

5. 设定一个 cron 任务,每 10 分钟执行一次。

* * * feb,jun,oct * /script/job.sh

6. 设定一个 cron 任务,在指定月份执行。

25 7 4 3 * /home/script/backup.sh

7. 在 3 月 4 日上午 7:25 运行 shell 脚本 /home/script/backup.sh

8. 设定一个 cron 任务,每 30 秒执行一次。

  • 由于 crontab 不能直接控制秒数,我们可以通过以下两步实现:
* * * * * /home/scripts/script.sh
  • 首先,设定一个每分钟运行的任务。
* * * * * sleep 30; /home/scripts/script.sh

然后使用 sleep 命令暂停执行 30 秒。

这样,上述任务会先暂停 30 秒,然后再继续执行。

Cron 配置文件的类型

Cron 配置文件主要分为两种:

UNIX/Linux 系统 Crontab

这种类型的 crontab 通常需要 root 权限才能使用,因为它主要用于系统服务和关键任务。在语法描述中,第六个字段是执行命令的用户名,这使得系统 crontab 能够以任意用户身份运行命令。

用户 crontab

用户可以使用 crontab 命令来管理自己的 cron 作业。 同样,第六个字段是要执行的命令,并且所有命令都以创建 crontab 的用户身份运行。 虽然每个用户的 crontab 文件位于 /var/spool/cron/crontabs 目录下,但并不建议直接编辑这些文件。 我们应该使用 crontab 命令来管理自己的 cron 作业。

它是如何运作的? cron 服务(守护进程)在后台运行,并持续(每分钟)检查 /etc/crontab 文件和 /etc/cron.*/ 目录,还会检查 /var/spool/cron/ 目录。 命令由执行 cron。

当分钟、小时和月份字段与当前时间匹配,并且至少有一个日期字段(月份中的某天或星期几)与当前日期匹配时,相应的命令会被执行。

基本命令

列出已有的 Cron 作业

crontab -l

我们可以使用以下命令列出所有的 Cron 作业,而无需打开 crontab 配置文件:

[[email protected] ~]# crontab -l
no crontab for techblik.com
[[email protected] ~]#

如果没有已存在的作业,将会返回以下信息:

[[email protected] ~]# crontab -l
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').#
# Notice that tasks will be started based on the cron's system
# daemon's notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
# m h  dom mon dow   command
0 */1 * * * /home/account/scripts/updateAccountStatuses.sh
0 */1 * * * /home/account/scripts/reActivateAccountStatus.sh
[[email protected] ~]#

如果用户已经添加了一些作业,它将显示如下:

cron 表是特定于用户的,这意味着必须使用特定用户登录才能查看其 cron 表列表。

列出特定用户的 Cron 作业

要列出其他用户的计划作业,可以使用 `-u` (用户)和 `-l` (列表)选项。

crontab -u 其他用户名 -l

示例:crontab -u techblik.com -l

添加/修改 Crontab 条目

要编辑 crontab 条目,我们可以使用 `-e` 选项,如下所示。

crontab -e

上述命令将打开 vi 编辑器,你可以在其中编辑作业的详细信息并保存文件。保存后,你可以使用 `crontab -l` 来确认 cron 是否配置成功。

为特定用户添加/修改 Crontab 条目

crontab -u another_username -e

我们可以使用以下命令为另一个用户编辑 crontab:

示例:crontab -u techblik.com -e

删除 crontab 条目

可以使用 **-r** 参数来删除完整的计划作业,而无需进行确认。

crontab -r

crontab -i -r
[[email protected] ~]# crontab -i -r
crontab: really delete techblik.com's crontab?

如果你想在删除计划作业之前进行确认,可以使用带 `-r` 的 **-i** 选项,这样会在删除用户的 crontab 之前提示用户确认。

crontab 特殊字符串

除了前面介绍的语法,crontab 还提供八个特殊字符串,不仅可以节省时间,还能提高可读性。
特殊字符串
描述
@reboot
系统启动后运行一次。
@yearly
每年运行一次,即 0 0 1 1 *
@annually
与 @yearly 相同。
@monthly
每月运行一次,即 0 0 1 * *
@weekly
每周运行一次,即 0 0 * * 0
@daily
每天运行一次,即 0 0 * * *
@midnight
与 @daily 相同。
@hourly
每小时运行一次,即 0 * * * *

Crontab 特殊字符串示例

1. 使用 crontab 每年安排任务:

@yearly /scripts/greeting.sh

可以使用上述命令在每年的第一分钟发送新年祝福。

2. 使用 crontab 安排每月执行的任务:

@monthly /scripts/cleanup.sh

可以使用上述命令在每个月初执行一些清理任务。

同样,其他 crontab 特殊字符串可以用于每周、每天和每小时的目的。

cron 目录

  • 系统管理员可以使用预定义的 cron 目录来安排系统范围的 cron 作业,如下所示:
  • /etc/cron.d
  • /etc/cron.daily
  • /etc/cron.hourly
  • /etc/cron.monthly

/etc/cron.weekly

Crontab 真实示例

我们来讨论一些系统管理员或 IT 专业人员常用的真实示例。

删除空文件和目录

45 0 * * * techblik.com find /tmp -type f -empty -delete

上述 cron 表达式会从 /tmp 目录中查找空文件和目录,并将其删除。 该作业将在每天上午 12:45 运行。 需要指定用户名来执行这项工作。 在这个例子中,用户 techblik.com 正在执行 cron 作业操作。

使用单个 cron 执行多个任务

* * * * * /home/scripts/backup.sh; /home/scripts/scriptp.sh

多个任务/作业可以用分号 (;) 分隔,并且可以分配给单个 cron 表达式。

Cron 格式化和测试工具

到目前为止,我们已经讨论了 crontab 的命令和语法来安排任务。 然而,如果你不是系统管理员,或者你的工作不是经常设置 cron 任务,你可能很难记住语法,并且容易出错。 别担心,我们有办法解决这个问题。

网上有很多 cron 格式化工具。

# 1. Cron 作业生成器 Cron 作业生成器

提供了一个用户友好的图形界面,你可以在其中指定脚本的分钟数、日期和路径,然后生成 crontab 代码。

让我们看一个实际的例子,假设我们需要在周一到周五每 5 分钟执行一次 /home/processMonitor.sh。

那么,我们得到的 crontab 代码如下,可以通过执行 `crontab -e` 将其添加到你的 crontab 中:

0,5,10,15,20,25,30,35,40,45,50,55 * * * 1-5 /home/processMonitor.sh

# 2. Easycron Easycron

是一个实用的基于 Web 的 cron 作业调度器。 通过指定要调用的 URL 并设置其执行时间,可以创建一个 cron 作业。 也可以选择手动添加 cron 表达式,或者以描述性形式添加。 此外,为了提高安全性,还可以选择使用基本的 HTTP 身份验证。

不仅如此,Easycron 还可以用于实现标准 cron 表达式、cron 作业执行日志、电子邮件通知、单独的失败日志等其他用途。

# 3. crontab 生成器 crontab 生成器

是另一个方便的 crontab 生成工具,通过该工具,你可以选择是否将 cron 输出保存到文件或发送到电子邮件。

# 4. Crontab 大师 Crontab 大师

是一个简单的在线 cron 调度表达式编辑器。 此外,它还提供了一种有用的方法来监视你的 cron 作业。 你需要做的就是复制提供的命令并将其附加到 crontab 定义的末尾。 如果 cron 作业失败,或者甚至没有启动,你将收到一封警报电子邮件。

在下面的例子中,作业将在每天、每月和每周的 04:05 执行。

# 5. CRON 测试仪 CRON 测试仪

允许我们测试 cron 时间/日期定义。 在某些情况下,我们可能需要解码现有的 cron 语法以进行故障排除或者只是想进行测试。

为此,我们可以使用这个工具。 我们需要做的就是将 cron 表达式复制并粘贴到 cron 定义字段中,然后选择迭代次数并单击“测试”以查看它将在哪些日期运行。

让我们检查一下 cron 表达式 `4 3 */2 * *`,它应该每两天在 03:04 (AM) 运行一次。 让我们使用 cron tester 来验证一下。

结论 希望以上内容可以帮助你更好地理解 crontab 并设置 cron 作业。 通过 cron 调度作业是 Linux 管理员执行的众多任务之一。 如果你有兴趣学习更高级的技能,请查看此课程

.