注:

使用 Crontab 实用程序调度 Oracle Linux 上的任务

准备

本教程展示如何在 Oracle Linux 上使用 crontab 命令。本教程针对 Oracle Linux 8 用户,但其他 Oracle Linux 发行版也提供了这些命令。

背景信息

Oracle Linux 可以按调度的任务或作业自动运行程序。您可以通过编辑 /etc/cron* 中的 cron 配置来将程序安排为作为系统级任务运行;也可以安排程序在用户 crontab 中作为作业运行。如果您对某个系统没有系统管理员访问权限,或者您希望调度的程序特定于您的用户帐户,则 crontab 实用程序提供了一种很好的机制,可以在您自己的用户凭证下定期运行程序。使用 crontab 可以将作业调度为每分钟运行一次,或者安排为每年运行一次;但是,请注意,如果在计划运行作业期间系统停机,则 cron 作业不会运行。

本教程面向 Oracle Linux 8 用户,但 crontab 也适用于 Oracle Linux 7,本教程的内容应平等应用于该平台。请注意,cron 配置在大多数 Linux 系统上都是标准的,自 1975 年以来就适用于类似 Unix 的系统。在 Systemd 中以计时器形式包括更为复杂的调度解决方案,鼓励用户更深入地探究 Systemd 计时器以解决特定要求。但是,本教程提供了适合平均用户的基础培训。

需要做哪些准备?

目标

在本教程中,您将学习:

列出 crontab 文件的内容

注意:使用免费实验室环境时,请参见 Oracle Linux Lab Basics 了解连接和其他使用情况说明。

使用 crontab -l 命令列出 crontab 文件的内容。

crontab -l

如果用户不存在 crontab 条目,将显示以下消息:

no crontab for oracle

创建或编辑 crontab

  1. 使用 crontab –e 命令在默认编辑器中打开 crontab:

    crontab -e
    

    Oracle Linux 8 中的默认编辑器是 vim 编辑器。

  2. 在文件的末尾添加以下行以创建每分钟运行 echo 命令的 crontab 作业:

    * * * * * echo "Hello World"
    

    在 vim 中:

    • 您可以按“Shift-g”跳到文件底部。
    • 按 "i" 键进入插入模式。
    • 输入 crontab 行。
    • 按 "Esc" 键退出插入模式。
    • 输入 ':wq' 以编写文件并设置编辑器。

    此步骤将安装 crontab 并使其立即处于活动状态:

    crontab: installing new crontab
    
  3. 列出 crontab 中的条目以显示新条目:

    crontab -l
    

每个作业都显示在 crontab 中的各自行上。crontab 包含 5 个空格分隔的字段,这些字段定义了可以配置的不同时间段,后跟为作业运行的命令。该命令可以等同于可在系统上的命令行上运行的任何命令,允许您运行自己的脚本或者利用管道和重定向运算符。

检查 cron 条目输出

默认情况下,邮件传输代理 (Mail Transport Agent, MTA) 未安装在最小的 Oracle Linux 系统或 Oracle Linux 平台映像上。如果未找到 MTA,则 cron 守护进程会将 crontab 中指定的命令的输出定向到 Syslog 守护进程。在 Oracle Linux 8 的新安装上,可以在位于 /var/log/cron 的日志文件中查看 crontab 输出。

运行以下命令以查看由新 crontab 条目生成的输出:

sudo tail /var/log/cron

请注意, cron 任务仅每分钟运行一次,因此可能需要等待一分钟才能运行该命令。此 cron 条目的输出应类似于:

Jun 30 12:39:02 ol8-server CROND[68564]: (oracle) CMD (echo "Hello World")
Jun 30 12:39:02 ol8-server CROND[68551]: (oracle) CMDOUT (Hello World)

此输出显示运行命令的用户、运行的命令,然后显示命令输出。

如果安装了 MTA(如 postfixsendmail),则 cron 会将 crontab 项的输出定向到运行 crontab 条目的用户的邮件假脱机。本教程稍后将进一步讨论。

Crontab 时间序列选项

Crontab 时间字段按以下顺序定义:

可以在以下任何时间字段中使用特殊字符:

crontab 还允许使用特殊的快速扩展来替换一般时间要求的时间字段。重要的是,此简写还包括一个在重新引导后运行命令的选项:

请注意, crontab 仅提供 1 分钟的粒度。设置比每分钟更频繁运行的 crontab 条目并非简单明了。如果要查找能够处理此问题的工具,请考虑查看 Systemd 计时器单元。

编辑 crontab 以尝试在不同的时间序列上运行不同的命令

  1. 使用 crontab –e 命令在默认编辑器中打开 crontab:

    crontab -e
    
  2. 将以下项添加到 crontab:

    */15 * * * * echo "This crontab entry runs every 15 minutes"
    10 * * * * echo "This crontab entry runs at 10 minutes past every hour"
    30 13 * * 3 echo "This crontab entry runs at 13h30 on every Wednesday"
    @reboot echo "This command runs once after a reboot event"
    
  3. 保存 crontab 文件并退出。

Crontab 命令语法

crontab 命令在 crontab 所属用户的凭证下运行并在设置了某些默认环境变量的情况下运行,包括:

您可以通过将替代环境变量指定为不包括时间字段的 crontab 中的行来设置替代环境变量,例如,如果您希望使用 bash shell 并且希望使用个人 .bashrc 配置定期导入所有变量和设置,则可以编辑 crontab,如下所示:

SHELL=/bin/bash
* * * * * source $HOME/.bashrc;

由于针对 crontab 作业的命令在 shell 环境中执行,因此会应用标准 shell 语法,并可用于管道或重定向输出。例如,要将所有输出重定向到 /dev/null,从而禁用作业的任何邮件输出,请在命令上对 STDOUT 和 STDERR 输出使用标准 shell 重定向:

* * * * * /path/to/command > /dev/null 2>&1

或者,可以重定向输出以附加到文件,以便每次运行时跟踪命令输出:

* * * * * /path/to/command >> $HOME/command.log

编辑 crontab 以使用命令语法进行实验

  1. 使用 crontab -e 命令在编辑器中打开 crontab。

  2. 添加以下项:

    */15 * * * * echo "This 'silent' crontab entry runs every 15 minutes but output is redirected to /dev/null" > /dev/null 2>&1
    * * * * * echo "The date and time is $(date +\%Y-\%m-\%d\ \%H:\%M:\%S)" >> $HOME/crontab.log
    

    请注意,由于 crontab 实用程序将 % 个字符更改为换行符,因此对 date 命令中的 % 字符进行转义,并将第一个 % 之后的所有数据作为标准输入发送到命令。有关更多信息,请参见 man 5 crontab

  3. 保存文件并退出。

一分钟内,cronab.log 文件应出现在 $HOME 目录中。您可以通过运行以下命令查看此文件的内容:

tail $HOME/crontab.log

访问本地邮件假脱机中的 crontab 输出

如果安装了 MTA,默认情况下,所有 crontab 输出都会通过邮件发送到用户的系统邮件假脱机。

注意:以下说明仅用于示例目的,不描述邮件传输代理 (mail Transfer Agent, MTA) 的完整配置。配置默认值可能不适用于安装。如果要在系统上启用后缀,另请阅读 Oracle Linux: Install the Postfix Email Server 以了解有关正确配置它的信息。

要使 crontab 邮件处理正常工作,必须正确安装、配置和启用 MTA。为了本练习的目的,只需执行以下步骤,后缀 MTA 即可处理本地邮件:

  1. 安装 postfix 软件包:

    sudo dnf install -y postfix
    
  2. 启用和启动后缀服务。默认配置仅启用后缀作为本地传送 MTA:

    sudo systemctl enable --now postfix.service
    
  3. 重新启动 crond 服务,以便它开始使用后缀 MTA 来处理邮件传送:

    sudo systemctl restart crond.service
    

如果尚未将 crontab 配置为将输出重定向到备用邮件地址或放弃 cron 作业的输出,则每个作业的输出会自动传送到用户的本地邮件假脱机。邮件假脱机通常存储为可在 /var/spool/mail/$USER 访问的单个邮件文件。如果只是监视最近的活动,则最容易调整此文件以在传送时查看邮件:

tail -f /var/spool/mail/$USER

要查看可管理接口中每个 cron 作业的输出,请安装 mailx 软件包并使用 mail 命令查看邮件假脱机的内容:

sudo dnf install -y mailx
mail

邮件按以下方式列出:

Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/oracle": 1 messages 1 new
>N  1 (Cron Daemon)         Wed Aug  5 23:48  30/1436  "Cron oracle
&

输入要查看的邮件的号码。例如,输入 1 查看队列中的第一条消息:

& 1
Hello World

使用 header 命令返回到邮件头列表,或使用 quit 命令退出应用程序。

您可以通过在 crontab 中设置 MAILTO 环境变量来更改用于邮件 cron 输出的电子邮件地址,但系统必须配置为处理外部邮件传送。如果将 MAILTO 环境设置为空值,则会丢弃输出,并且不对 crontab 中的任何 cron 作业发送邮件。

删除整个 crontab

使用 crontab -r 命令删除用户的整个 crontab。

crontab -r

此命令将删除您为用户指定的所有 cron 作业条目。如果只想删除特定的作业条目,请使用 crontab -e 编辑 crontab 并删除要删除的作业的行。

视频演示

如果需要有关在 Oracle Linux 8 上使用 crontab 实用程序的更多信息,请在 https://www.youtube.com/watch?v=BpPGoRYTv9I 中提供视频演示。

Oracle Linux 8 自动化任务 Cron 实用程序

更多信息

更多学习资源

docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。

有关产品文档,请访问 Oracle 帮助中心