Linux crontab 教程与示例
如果您已经有一些 Linux 系统管理员的经验,那么您很可能知道 cron 是什么以及它的作用。如果您刚刚开始使用 Linux,那么这些基本知识肯定会对您以后有所帮助。不管怎样,如果你已经掌握了这些知识,这篇文章将会刷新你的知识。如果没有,您将获得入门指南。因此,您只需要具备一些 Linux 系统的基本知识,并且像往常一样,有学习的欲望。
Cron 的名字来自 Chronos,希腊语中时间的化身。这是一个非常有灵感的选择,因为 cron 可以帮助您安排您希望系统在给定时间执行的不同任务。如果您使用 Windows 系统,您很可能会偶然发现计划任务工具。一般来说,目的是相同的,差异是……嗯,太多了,无法在此一一列举。
这个想法是 cron 更灵活,更适合严肃的系统管理任务。如果您需要一些示例用例,只需考虑备份:当您负责数百台机器时,您是否想执行备份任务?我们认为不是。例如,您只需使用 rsync 编写一个简单的 Bash 脚本,安排它每天运行,然后就不用管它了。您现在所要做的就是不时检查日志。我们甚至知道有人使用 cron 来提醒他们重要的个人事件,例如生日。
但 cron 只是一个守护进程,运行您告诉它运行的任务。有没有一个工具可以帮助我们编辑/添加/删除这些任务?当然,它叫做 crontab(这个名字来自 cron 表)。但让我们从头开始。继续阅读以了解如何使用 cron。
在本教程中您将学习:
Linux 上有必要安装 cron 吗?
如何使用cron来安排任务
年度、每月、每日任务等的多个 crontab 示例。
如何使用
/etc/
目录中的 cron 文件
我需要安装 cron 吗?
大多数 Linux 发行版都使用 Vixie Cron 或某些衍生版本 (Fedora) 作为默认的 cron 实现,这就是我们将在本文中使用的。此外,大多数发行版都已经安装了 cron,因为它是任何 Linux 系统中非常重要的一部分。尽管您(如果是桌面用户)可能不需要直接使用它,但您的系统或某些已安装的应用程序可能需要(定期更新联机帮助页数据库就是一个很好的例子)。
所以基本上我们在本节中没有什么可写的,因为我们知道的大多数发行版都在基本系统中包含了 cron。一个值得注意的例外是 Gentoo,您必须手动安装 vixie-cron 并将其添加到默认运行级别。 Arch、Debian 和 Slackware,以及所有 Ubuntu 版本、Fedora 和 OpenSUSE 都在基础中安装了 cron,并设置为在启动时启动。我们建议(事实上,强烈建议)您阅读 cron 和 crontab 手册页,因为许多 Linux 发行版都会修补其软件,以便更好地适应系统的其余部分。
因此,例如,您在 Gentoo 上找到的一项功能很可能在 Slackware 上不可用。无论如何,没有什么比阅读手册更好的了,尤其是在处理您将经常使用的新软件时。
如何使用计划任务
现在,让 cron 开始工作。我们首先要考虑的是我们需要运行什么命令。是否需要root权限?现在假设我们将使用 crontab 添加一个简单的脚本,以普通用户的身份每五分钟执行一次。
计划任务示例
让我们编写一个简单的脚本,它将在终端中显示一个简单的基于curses的对话框(需要对话框和一些终端模拟器——我们将在这里使用xterm):
#!/bin/sh
xterm -e "dialog --msgbox 'Testing cron...' 234 234"
# This is a very simple example, treat it as it is
将文件命名为 crontest.sh
并使其可执行,因为 cron 执行的所有内容都必须是可执行的。
$ chmod +x crontest.sh
现在我们必须编辑用户的 crontab 以便为我们奇妙的脚本添加一个条目:
$ crontab -e
-e
代表编辑,-r
代表删除。
警告
要非常小心!许多系统管理员出于疲劳或粗心,输入 -r
而不是 -e
,因为这些键彼此相邻,并删除了所有 crontab 条目。
不管怎样,你很可能会看到一个带注释的文件(crontab 使用 # 来注释),它为你提供了示例并解释了每个字段的作用。是的,crontab 条目由字段组成,最后一个指定要执行的命令,其余的是特定于时间的条目,正如我们将看到的。
现在,我们在 crontab 中每五分钟执行一次的脚本的条目是:
*/5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
我们需要导出 xterm 的 DISPLAY 变量,以免向我们发送“DISPLAY is not set”错误。现在,让我们看看每个字段的作用。
crontab 字段
如果您曾经使用过通配符,那么您会熟悉 crontab 中的星号:它们的意思是“匹配所有值”。默认 Linux crontab 中的字段(注意,其他一些 Unix 系统可能有不同的 cron 实现)的含义是,从左到右:分钟、小时、月份中的某一天、月份、星期几、年份(非强制)和命令, 分别。
因此,如果我们想在每小时、每天、每月和每年的每过五分钟运行我们的脚本,我们就这样做:
5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
我们强烈建议您注意星期字段:也许在您的国家/地区,一周的第一天是星期一,但也有其他文化将一周的第一天设置为星期日。如果在跨国、多元文化环境中工作,您必须注意文化和宗教差异。
默认情况下,Cron 通过电子邮件向拥有该作业的用户发送通知 ($user@$hostname)。如果您想更改地址,只需在 crontab 中使用 MAILTO=$email_address
即可。如果您想禁用此功能,请将 >/dev/null 2>&1
放在条目末尾。
现在,如果您已经厌倦了每五分钟出现一次的弹出窗口,请再次使用 crontab -e 删除它,或者更简单,将其注释掉。如果您想查看 crontab 中的内容,只需使用 -l
(列表)选项即可。我们邀请您尝试一下,创建新条目,看看它们是否按您的预期工作。
/etc 目录中的 Cron 文件
我们之前所做的只是一些琐碎且可能有趣的事情,以便让您入门。从现在开始,我们将假设您有一些严肃的事情需要处理,并朝这个方向前进。上面的副标题指的是 /etc
中负责定期系统维护任务的目录。
例如,由于我们之前提到过,我们的 /etc/cron.weekly
包含一个名为 man-db
的脚本,它更新手册页数据库。这些是您的发行版附带的脚本,根据 /etc/crontab
文件运行。
由于最好的学习方法是进行一些研究,因此请花点时间亲自查看此文件。您将看到与之前阅读的类似的条目,只是要执行的命令有所不同。 run-parts
是一个小实用程序,旨在运行给定文件夹中的所有脚本,即 cron.{hourly,daily,weekly,monthly}
中的脚本。确保您了解它们何时运行以及为什么选择这些时间/日期。
细心的读者可能已经注意到 /etc/crontab
中有一个字段在编辑他/她的 crontab 时不存在:用户字段。解释很简单,原因就是安全。如果您以 $user
身份调用 crontab -e
,则可以肯定任何计划的命令都会以 $user
身份运行。
但由于 /etc/crontab
是系统范围的,因此似乎需要指定用户,因为可能某些脚本或应用程序必须以另一个用户(而不是 root 用户)身份运行,尤其是系统管理员是否具有安全意识并根据需要向系统添加用户和组。
举个例子:对于备份,您不需要 root 用户的全部权限,只需要读取和写入特定位置的必要权限(还有更多内容,但让我们保持简单)。因此,管理员创建一个 backups
组和一个 backupadmin
用户,并具有必要的权限,并通过 cron 执行夜间备份脚本,如下所示:
30 23 * * * backupadmin /home/backupadmin/nightlybkup.sh
这将在每晚 23:30 执行最后一个字段中指定的脚本。现在,如果我们希望仅在周一到周五执行备份,我们会这样做:
30 23 * * 1-5 backupadmin /home/backupadmin/nightlybkup.sh
如果您只想在晚上备份,但只需要周一、周三和周五,请将 1-5
替换为 1,3,5
。一旦您上手并确切地知道自己需要什么,cron 将变得易于使用且易于理解。
安全考虑
在很多情况下,您不希望允许每个有权访问您的系统的用户创建 crontab 条目。这就是 /etc/cron.deny
和 /etc/cron.allow
发挥作用的地方。它们的用法与 /etc/hosts.allow
和 /etc/hosts.deny
基本相同,因此如果您过去使用过这些文件,您会感觉很舒服家。这两个文件(cron.deny 和 cron.allow)默认情况下不存在,至少在我们使用的系统上是这样,因此默认行为是允许每个人都有自己的 crontab 条目。您可以检查 /etc 中有哪些与 cron 相关的文件
$ ls /etc | grep cron
同样,这仅适用于 Linux,因为 Solaris 系统上缺少这些文件意味着完全相反,而且这些文件具有不同的位置。首先检查 cron.allow
,因此我们通常在 cron.deny
中输入 ALL
,然后在 cron.deny
中仅输入我们想要授予访问权限的用户代码>cron.allow。
Cron 调度程序示例
为了熟悉 crontab 语法(一开始有点令人困惑),我们编制了一个各种示例列表,这些示例将安排各种不同时间和频率的任务。
每分钟运行一个脚本:
* * * * * /usr/local/bin/check-disk-space.sh
该命令将每分钟、每天和每月执行一次。
该命令将在每年 1 月、6 月和 12 月 10 日的 02:30 执行
checkdrive.sh
脚本。30 02 10 01,06,12 * /home/$user/bin/checkdrive.sh
每半小时运行一次脚本:
00,30 * * * * /home/$user/backupdata.sh
仅在周末运行:
* * * * 6,7 /usr/bin/weekend
每天跑两次。该活动将于每天 11:20 和 16:20 运行。
20 11,16 * * * /usr/sbin/command
该服务将于每年 5 月 2 日每小时运行一次。
01 * 2 05 * /sbin/system_command
以下命令将在周一至周五每 10 分钟运行一次。
*/10 * * * 1-5 /usr/local/bin/check-disk-space.sh
该命令在工作时间和工作日都会执行一次。
00 09-17 * * 1-5 /usr/local/bin/check-disk-space.sh
该命令每年仅执行一次,即 1 月 1 日午夜
0 0 1 1 * /usr/local/bin/check-disk-space.sh
该命令每年(每 6 个月)在中午 12 点和中午 12 点执行两次。
0 0,12 1 */6 * /usr/local/bin/check-disk-space.sh
此命令将在任何给定月份的每个第三个星期四上午 10 点执行。
0 10 15-21 * 4 /usr/local/bin/check-disk-space.sh
该命令将在每天偶数整点后 20 分钟(0:20、2:20…22:20)执行。
20 0-23/2 * * * /usr/local/bin/check-disk-space.sh
结束语
尽管一开始您可能会发现 cron 条目有点令人畏惧,但不久之后您就会记住这些字段的顺序和含义,并且由于现在您知道要编辑的文件在哪里,因此使用 cron 进行调度将变得轻而易举。所需要的只是一点练习。