注:
- Oracle 提供的免费实验室环境中提供了本教程。
- 它使用 Oracle Cloud Infrastructure 身份证明、租户和区间示例值。完成实验室后,请使用特定于您的云环境的这些值替换这些值。
使用 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 计时器以解决特定要求。但是,本教程提供了适合平均用户的基础培训。
需要做哪些准备?
- 安装了 Oracle Linux 的系统
目标
在本教程中,您将学习:
- 列出现有 crontab 的内容
- 创建和编辑 crontab 条目
- 访问 crontab 输出
- 删除用户的完整 crontab
列出 crontab 文件的内容
注意:使用免费实验室环境时,请参见 Oracle Linux Lab Basics 了解连接和其他使用情况说明。
使用 crontab -l
命令列出 crontab 文件的内容。
crontab -l
如果用户不存在 crontab 条目,将显示以下消息:
no crontab for oracle
创建或编辑 crontab
-
使用
crontab –e
命令在默认编辑器中打开 crontab:crontab -e
Oracle Linux 8 中的默认编辑器是 vim 编辑器。
-
在文件的末尾添加以下行以创建每分钟运行 echo 命令的 crontab 作业:
* * * * * echo "Hello World"
在 vim 中:
- 您可以按“Shift-g”跳到文件底部。
- 按 "i" 键进入插入模式。
- 输入 crontab 行。
- 按 "Esc" 键退出插入模式。
- 输入 ':wq' 以编写文件并设置编辑器。
此步骤将安装 crontab 并使其立即处于活动状态:
crontab: installing new crontab
-
列出 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(如 postfix 或 sendmail),则 cron 会将 crontab 项的输出定向到运行 crontab 条目的用户的邮件假脱机。本教程稍后将进一步讨论。
Crontab 时间序列选项
Crontab 时间字段按以下顺序定义:
- 分钟:从 0 到 59
- 小时: 0 至 23
- 日:从 1 到 31
- 月:1 至 12 或月份名称
- day-of-week:从 0 到 7,或日期的缩略名称。请注意,0 和 7 都表示星期日。
可以在以下任何时间字段中使用特殊字符:
- 星号 (*):指定应为字段的每个实例运行该命令
- 连字符 (-):可用于指示范围。例如,在“星期几”字段中,您可以指定 1-5 将任务安排在星期一到星期五运行,但不会在星期六或星期日运行。
- 逗号 (,):可用于指定字段的值列表。例如,在小时字段中,您可以指定 6,18 将任务安排在上午 6 点和下午 6 点运行。
- 正斜杠 (/):可用于指定步骤值。例如,您可以在分钟字段中指定 */15,以将任务安排在每 15 分钟运行一次。
crontab 还允许使用特殊的快速扩展来替换一般时间要求的时间字段。重要的是,此简写还包括一个在重新引导后运行命令的选项:
- @reboot:在重新引导后运行一次。
- @yearly:每年运行一次,即“0 0 1 1 *”。
- @annually:每年运行一次,即“0 0 1 1 *”。
- @monthly:每月运行一次,即“0 0 1 * *”。
- @weekly:每周运行一次,即“0 0 * 0”。
- @daily:每天运行一次,即“0 0 * * *”。
- @hourly:每小时运行一次,即“0 * * * *”。
请注意, crontab 仅提供 1 分钟的粒度。设置比每分钟更频繁运行的 crontab 条目并非简单明了。如果要查找能够处理此问题的工具,请考虑查看 Systemd 计时器单元。
编辑 crontab 以尝试在不同的时间序列上运行不同的命令
-
使用
crontab –e
命令在默认编辑器中打开 crontab:crontab -e
-
将以下项添加到 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"
-
保存 crontab 文件并退出。
Crontab 命令语法
crontab 命令在 crontab 所属用户的凭证下运行并在设置了某些默认环境变量的情况下运行,包括:
- HOME:cronab 以其身份运行的用户的起始目录
- LOGNAME:等同于 crontab 作为其运行的用户的用户的用户名
- USER: crontab 以其身份运行的用户的用户名
- SHELL:用于运行命令的 shell 二进制文件。默认情况下,此项设置为
/bin/sh
。 - PATH:cronab 实用程序可用的路径。默认情况下,此项设置为
/usr/bin:/bin
。
您可以通过将替代环境变量指定为不包括时间字段的 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 以使用命令语法进行实验
-
使用
crontab -e
命令在编辑器中打开 crontab。 -
添加以下项:
*/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
。 -
保存文件并退出。
一分钟内,cronab.log 文件应出现在 $HOME 目录中。您可以通过运行以下命令查看此文件的内容:
tail $HOME/crontab.log
访问本地邮件假脱机中的 crontab 输出
如果安装了 MTA,默认情况下,所有 crontab 输出都会通过邮件发送到用户的系统邮件假脱机。
注意:以下说明仅用于示例目的,不描述邮件传输代理 (mail Transfer Agent, MTA) 的完整配置。配置默认值可能不适用于安装。如果要在系统上启用后缀,另请阅读 Oracle Linux: Install the Postfix Email Server 以了解有关正确配置它的信息。
要使 crontab 邮件处理正常工作,必须正确安装、配置和启用 MTA。为了本练习的目的,只需执行以下步骤,后缀 MTA 即可处理本地邮件:
-
安装 postfix 软件包:
sudo dnf install -y postfix
-
启用和启动后缀服务。默认配置仅启用后缀作为本地传送 MTA:
sudo systemctl enable --now postfix.service
-
重新启动 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 实用程序
更多信息
man 5 crontab
man systemd.timer
- Oracle Linux:安装 Postfix 电子邮件服务器
- Oracle Linux 文档
- Oracle 学习库
更多学习资源
在 docs.oracle.com/learn 上浏览其他实验室,或者在 Oracle Learning YouTube 渠道上访问更多免费学习内容。此外,访问 education.oracle.com/learning-explorer 以成为 Oracle Learning Explorer。
有关产品文档,请访问 Oracle 帮助中心。
Use the Crontab Utility to Schedule Tasks on Oracle Linux
F49757-03
May 2022
Copyright © 2021, Oracle and/or its affiliates.