介绍
如果您已经有Linux系统管理员的经验,那么您很可能知道cron是什么,它做什么。如果您只是开始使用Linux,那么必不可少的基础知识将在以后为您服务。无论哪种方式,如果您已经掌握了这些知识,那么本文都会对其进行刷新。如果没有,您将获得入门指南。因此,仅期望您具有Linux系统的一些基本知识,并且像往常一样渴望学习。
Cron的名字来自希腊时间的化身Chronos。这是一个非常受启发的选择,因为cron可帮助您安排希望系统在给定时间执行的不同任务。如果您使用的是Windows系统,那么您可能会偶然发现“计划任务”工具。一般而言,目的是相同的,区别是……嗯,这里太多了。这个想法是cron更灵活并且适合于严重的系统管理任务。如果您需要一些用例示例,请考虑一下备份:当您负责数百台计算机时,是否要执行备份任务?我们认为没有。您只需使用以下命令编写一个简单的shell脚本同步,例如,安排它每天运行一次,而不必理会它。您现在所要做的就是不时检查日志。我们甚至认识到使用cron提醒人们重要的个人事件(例如生日)的人。
但是cron只是一个守护程序,用于运行您告诉它运行的任务。有没有工具可以帮助我们编辑/添加/删除这些任务?当然,它叫做crontab(名称来自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
首先,我们必须确保在您的系统上启动了cron:
$ ps faux | grep cron
如果未返回任何内容,请确保启动cron并将其添加到默认服务,以便它可以在下次启动时启动。如何做到这一点是distribution-specific。在我们的Debian系统上,此命令返回
root 1424 0.0 0.0 22000 884 ? Ss 13:56 0:00 /usr/sbin/cron
检查此命令将在您的系统上返回什么,有什么不同以及是否以任何参数启动cron。
现在,让cron工作。我们首先要考虑的是我们需要运行什么命令。是否需要root特权?现在假设我们将使用crontab作为普通用户添加一个每五分钟执行一次的简单脚本。
Crontab
例
让我们编写一个简单的脚本,该脚本将在终端中显示一个简单的curses-based对话框(需要对话框和一些终端仿真器-我们将在此处使用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条目由字段组成,最后一个指定要执行的命令,其余的为time-specific条目,我们将看到。现在,我们在crontab中输入的脚本每五分钟执行一次,
*/5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
我们需要为xterm导出DISPLAY变量,以免向我们发送“未设置DISPLAY”错误消息。现在,让我们看看每个字段的作用。
Crontab栏位
如果您曾经使用通配符,那么您将熟悉crontab中的星号:它们的意思是“匹配所有值”。默认Linux crontab中的字段(注意,某些其他Unix系统可能具有不同的cron实现)是指从左到右,分钟,小时,每月的某天,每月,一周的某天,年份(非强制)和命令, 分别。因此,如果我们想在每小时,每天,每月和每年的五点钟之前每次运行脚本,我们将这样做:
5 * * * * export DISPLAY=:0 && /home/$user/crontest.sh
我们敦促您注意“星期几”字段:也许在您的国家/地区中,每周的第一天是星期一,但是在其他文化中,一周的第一天也设置为星期日。在多国,多文化环境中工作时,必须注意文化和宗教上的差异。 Cron默认通过e-mail向拥有作业的用户发送通知($ 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中的脚本。{每小时,每天,每周,每月}。确保您了解它们何时开始运行以及为什么选择这些小时/天的方式。
细心的读者可能已经注意到/etc /crontab中的一个字段在编辑其crontab时不存在:用户领域。解释很简单,原因是安全性。如果您以$ user身份调用crontab -e,则可以确定所有计划的命令都将以$ user身份运行。但是,由于/etc /crontab是system-wide,因此似乎需要指定用户,因为某些脚本或应用程序将必须以其他用户(而不是root)的身份运行,尤其是在sysadmin为security-conscious并添加用户和根据需要对系统进行分组。一个示例:对于备份,您将不需要root用户的全部权限,而只需要读写特定位置的必要权限(还有更多权限,但让我们保持简单即可)。因此,管理员将创建一个具有必要权限的备份组和一个backupadmin用户,并通过cron执行每晚的备份脚本,如下所示:
30 23 * * * backupadmin /home/backupadmin/nightlybkup.sh
它将在每晚23:30执行最后一个字段中指定的脚本。现在,如果我们希望仅在星期一至星期五执行备份,则可以这样做:
30 23 * * 1-5 backupadmin /home/backupadmin/nightlybkup.sh
如果只想在晚上进行备份,而只在星期一,星期三和星期五进行备份,则用”1,3,5″替换”1-5″。一旦您弄湿了脚并确切知道了您的需要,cron将变得易于使用和易于理解。
安全注意事项
在很多情况下,您不想允许每个有权访问系统的用户创建crontab条目。这是/etc/cron.deny和/etc/cron.allow起作用的地方。它们的用法基本上与/etc/hosts.allow和/etc/hosts.deny相同,因此,如果您过去使用这些文件,您会感到宾至如归。至少在我们使用的系统上,这两个文件(cron.deny和cron.allow)默认情况下不存在,因此默认行为是允许每个人都有其crontab条目。您可以使用以下命令检查/etc中的cron-related文件
$ ls /etc | grep cron
同样,这仅在Linux上,因为Solaris系统上缺少这些文件意味着完全相反,而且文件具有不同的位置。首先检查cron.allow,所以我们通常在cron.deny中输入”ALL”,然后在cron.allow中仅输入要授予访问权限的用户。
Cron Scheduler示例
每一分钟:
* * * * * /usr/local/bin/check-disk-space.sh
该命令将在每分钟,每天和每月执行一次。
日常:
30 02 10 01,06,12 * /home/$user/bin/checkdrive.sh
该命令将在1月,6月和12月10日的02:30执行checkdrive.sh脚本。
每半小时:
00,30 * * * * /home/$user/backupdata.sh
仅在周末:
* * * * 6,7 /usr/bin/weekend
一天两次:
20 11,16 * * * /usr/sbin/command
该活动每天在11:20和16:20进行。
在某个特定日期每小时:
01 * 2 05 * /sbin/system_command
该活动将于5月2日每小时运行一次。
在5个工作日(星期一至星期五)中每10分钟:
*/10 * * * 1-5 /usr/local/bin/check-disk-space.sh
上面的命令将每10分钟运行一次Monday-Friday。
仅在工作时间执行:
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
该命令每年1月1日午夜仅执行一次
一年两次,凌晨12点和下午12点
0 0,12 1 */6 * /usr/local/bin/check-disk-space.sh
该命令将每年12AM和12PM执行两次(每6个月一次)
在指定月份的每个第3个星期四上午10点执行
0 10 15-21 * 4 /usr/local/bin/check-disk-space.sh
该命令将在给定月份的任何第3个星期四的上午10点执行。
每隔一小时后每天20分钟:
20 0-23/2 * * * /usr/local/bin/check-disk-space.sh
该命令将在每偶数小时(0:20、2:20 … 22:20)之后的20分钟每天执行一次。
结论
即使您一开始可能会发现cron条目有点令人生畏,但片刻之后您仍会记住字段的顺序和含义,并且由于您现在知道要编辑的文件,使用cron进行调度将变得轻而易举。只需要一点练习即可。