使用cron进行自动维护电脑资料.docx
《使用cron进行自动维护电脑资料.docx》由会员分享,可在线阅读,更多相关《使用cron进行自动维护电脑资料.docx(9页珍藏版)》请在冰豆网上搜索。
使用使用cron进行自动维护电脑资料进行自动维护电脑资料使用cron进行自动维护-电脑资料通过cron子系统在任何时候运行任务,轻松实现常规维护要想实现连续不停的计算,任务必须能够在任何时候运行,开始之前本节解释本教程讲授什么内容,以及如何从中获得最大的收益。
关于本教程本教程解释如何配置和维护cron,cron是几乎所有UNIX计算机上都有的作业调度程序。
另外,本教程演示cron的其他一些应用。
目标前提条件本教程针对UNIX(和类UNIX)系统的用户和系统管理员。
要想学习本教程,您应该熟悉命令行shell和shell脚本。
具备在UNIX上安装和配置软件的经验也是有帮助的。
系统需求要想运行本教程中的示例,需要一台UNIX计算机。
如果希望配置系统范围的cron,还需要根访问权。
本教程中的示例基于在现代UNIX系统上广泛使用的Vixiecron,并使用UbuntuDesktopLinuxversion8.04.1。
其他版本的cron与Vixie相似;具体信息请参见自己的UNIX系统文档。
不中断运行与您和我不同,计算机可以永不疲倦地工作,以相同的精力执行每个任务。
另外,计算机可以每周7天每天24小时连续工作,包括风雪天和公共假日。
cron守护进程但是,要想实现连续不停的计算,任务必须能够在任何时候运行。
您可以晚上定时醒来,在几十台机器上登录并输入各种命令;也可以放心地休息,把工作交给cron。
cron是一个守护进程(也就是不间断运行的进程),它根据调度计划执行命令。
无论白天还是黑夜,无论工作多么繁重,cron都会毫无怨言地注意时间并按时运行作业。
需要监视FTP收存箱(drop-box)接收到的数据吗?
使用cron每几分钟运行一个shell脚本。
需要删除每天积累的草稿文件吗?
在午夜执行垃圾收集。
希望定期循环使用日志文件吗?
设置一个每周调度计划。
在这里,学习如何配置和维护cron并了解它的众多应用。
具体地说,本教程讨论Vixiecron,Vixie这个名称源自它的开发者PaulVixie。
在FreeBSD、AppleMacOSX、大多数风格的Linux和其他UNIX系统上都可以找到Vixiecron。
要想查明您的系统是否运行Vixiecron,可以输入mancron或mancrontab,查看末尾是否提到开发者是PaulVixie。
要想学习本教程和使用cron,您应该熟悉至少一种文本编辑器,比如vi或Emacs,还应该有使用UNIX命令行、shell脚本和shell环境变量的经验。
另外,如果希望修改系统范围的cron配置文件,还必须有根(超级用户)访问权。
了解cron概念cron守护进程是一个由实用程序和配置文件组成的小型子系统,在几乎所有类UNIX系统上都可以找到某种风格的cron。
cron的组件包括守护进程本身;一组系统范围的配置文件;一组针对特定用户的配置文件;一个用来添加、修改和删除用户配置文件的实用程序;以及一个简单的访问控制设施。
一般来说,cron配置文件或cron作业的列表被称为crontab或cron时间表。
守护进程cron连续运行,每分钟检查一次配置文件中的修改。
cron读取系统范围的和针对用户的crontab(分别在下面两段中详细说明)、相应地更新事件调度计划并执行这一分钟内应该执行的所有命令。
这个守护进程还捕捉每个作业的输出(如果有输出的话),并把结果通过电子邮件发送给作业的所有者。
可以在三个位置定义与系统相关的作业:
/etc/crontab、/etc/cron.d中的任何文件以及特殊目录/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly:
主要的系统crontab是/etc/crontab。
这个文件有独特的语法(在下一节中讨论),其中定义的每个作业根据它自己的时间表(比如每小时两次或每天一次)作为指定的用户运行。
使用/etc/crontab调度各种管理和维护任务。
还可以在/etc/cron.d目录中维护一组crontab。
通过创建crontab,按照逻辑对属于某一子系统的命令进行分组。
例如,PHP5编程语言的包在/etc/cron.d中安装一个名为php5的crontab,它会定期清除不使用的会话。
/etc/cron.d中的文件采用与/etc/crontab相同的语法,每个作业按照自己的时间表并作为特定的用户运行。
还可以把shell脚本直接放在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly或/etc/cron.monthly目录中,这样就可以每小时、每天、每周或每月运行此脚本一次。
放在这里的脚本作为超级用户运行。
针对用户的crontab集合通常放在/var/spool/cron/crontabs中。
(具体位置请参见您的UNIX系统文档。
一些系统把用户crontab放在/usr/lib中)。
但是,不能直接编辑此目录中的文件,而是使用crontab实用程序创建crontab并提交文件。
稍后讨论如何管理个人的crontab。
最后,可以分别使用访问控制文件/etc/cron.allow和/etc/cron.deny允许或拒绝用户访问cron。
例如,如果某个用户的作业可能会破坏系统的正常操作,就可以拒绝他访问cron。
如您所见,不需要为保持系统不间断运行而牺牲您的休息时间。
只需确定作业、定义它的调度计划并在适当的crontab中设置此作业,然后就可以放心地休息了。
现在就来看看cron文件的特殊语法。
处理crontabcrontab仅仅是一个文本文件,可以用任何UNIX编辑器编辑它。
它可以包含四种代码行:
空行、注释、环境变量设置和命令。
空行和注释文件中的空行和多余的空格被忽略。
空行和空格有助于提高crontab的可读性,使crontab组织有序。
还可以使用注释对每个作业的时间表和用途加以说明。
要想创建注释,只需在一行的开头加上一个井号(#)。
环境变量和命令cron最终使用一个shell执行每个命令。
可以通过环境变量修改或定制shell的行为。
在crontab中很容易设置shell环境变量。
只需输入VARIABLE=value,把VARIABLE替换为变量名,把value替换为一个值。
例如,crontab行:
指定一个有序的目录列表作为shell搜索路径。
cron预定义了五个环境变量:
PATH的默认值是/usr/bin:
/bin。
SHELL预设置为/bin/sh。
LOGNAME初始化为crontab所有者的用户名。
HOME设置为crontab所有者的主目录,比如/home/joe。
MAILTO设置为crontab所有者的名称。
要想修改这些默认值或设置任何变量,只需在crontab中设置适当的环境变量。
当然,crontab可以包含任意数量的命令行。
每个命令行指定一个频率、一个用户名(只对于系统crontab)和一个要运行的任务。
例如,命令:
在每天12:
05a.m(50*)删除/tmp中的所有空文件和目录(find/tmp-typef-empty-delete)。
此作业作为根用户(root)运行。
系统crontab命令必须指定一个用户名,作为运行此任务所用的用户。
(因此,在/etc/crontab中可能看到上面的命令)。
针对用户的crontab不能指定用户名;一个用户的cron命令总是作为这个用户运行。
是否有用户名是系统crontab和用户crontab之间的惟一差异。
下面讨论定制时间表的众多方式。
定制时间表cron时间表允许以多种方式运行作业,比如每分钟或在特定日期的特定时间。
调度的参数非常灵活。
cron字段表1.cron作业的调度选项除了名称或数字之外,还可以使用星号(*)表示“所有”。
例如,在分钟位置上的星号表示这一天中的每一分钟。
(在某些情况下确实需要如此高的频率,但是一定要小心,以这种频率执行的任务应该非常简单,不会长时间运行)。
还可以使用值的列表、范围和步长(增量)分别指定多个值、连续的值范围和不连续的值范围。
甚至可以组合使用列表和范围。
列表是一个逗号分隔的值集。
范围由启始值和结束值(含)以及可选的步长值构成。
我们来看一些示例。
表2中的每一行包含一个时间表及其说明。
当分、小时和日期字段与当前时间匹配时,cron会执行命令;如果月中日和周中日受到限制(也就是说,不是*),那么当这两个字段中至少一个与当前时间匹配时,cron也会执行命令。
表2.cron作业的时间表示例如您所见,实际上可以使用这五个参数指定任何调度计划。
为了更加简便,Vixiecron还提供了常用调度计划的简写形式。
表3列出一些简写形式。
表3.常用调度计划的简写形式如果喜欢使用简写形式,只需用它们替代cron命令的前五个字段。
下面这个命令看起来简单多了。
crontab命令示例掌握了基本概念之后,我们来看一些用户crontab命令示例。
同样的命令也可以应用系统范围:
只需在所有系统crontab项中周中日字段(第五个字段)后面指定一个用户名。
创建个人crontab要想创建个人crontab,可以用任何文本编辑器创建一个文件。
按照惯例,个人crontab文件保存在/.crontab中,但是可以使用任何文件名。
通过crontab实用程序提交个人crontab在编辑文件(比如/mycrontab)之后,通过crontab实用程序把它提交给cron:
查看cron中存储的信息要想查看cron中存储的信息,可以输入crontab-l:
替换crontab在任何时候,都可以使用crontab实用程序替换您的crontab,替代cron的机制尽管cron确实很有用,但是您还应该了解可以替代它的两种机制。
anacron如果系统常常关机或进入休眠状态(例如,如果使用UNIX笔记本计算机的话),那么可以考虑在系统中添加anacron。
anacron与cron的相似之处在于,它也把作业安排在以后运行;但是,与cron不同,即使作业的预定运行时间已经过了,anacron也会运行作业。
例如,如果安排在星期六运行文件系统备份,但是系统在星期五到星期一关机了,那么当系统在星期一重新启动时,anacron会立即运行星期六的作业。
与之相反,cron仅仅检查现在是否应该运行作业;因此,如果在作业的预定运行时间系统是关闭的,就不运行作业。
anacron的调度选项比cron少得多。
它只能以整天的时间间隔调度作业,比如一天、7天或30天;但是对于那些必须频繁且可靠地运行的作业,它是更好的选择。
另外,必须从cron启动anacron。
每当anacron运行时,它读取自己的配置文件。
配置文件包含由作业及其频率(用天数表示)组成的配置对。
如果作业在预定的时间没有运行,anacron就运行此作业并记录运行作业的时间。
运行完所有作业之后,anacron退出。
在大多数Linux发行版上都可以找到anacron,但是也很容易自己下载并构建源代码。
访问anacron项目页面获得最新版本。
anacron的主要配置文件可以在/etc/anacron中找到。
可以像配置cron时那样设置环境变量,但是更简单:
第一个数字是周期,所以1表示每天运行一次,7表示每7天运行一次,等等。
第二个数字是延迟,也就是从anacron启动之后到执行这个作业之间等待的分钟数。
如果把延迟字段设置为不同的值,就可以防止所有作业同时启动。
名称day-to-day只是一个有帮助的昵称。
配置行的其余部分指定作业;在这里,每天运行在指定路径中找到的shell脚本daily.chores.sh一次。
anacron以手册页形式提供了出色的文档,还可以在网上找到关于anacron的提示。
(请阅读我在2007年10月编辑的RodSmith撰写的LinuxMagazine文章)。
anacron适合UNIX爱好者和需要额外保障的系统管理员使用。
launchd:
cron的现代替代机制尽管可以在crontab文件中定义cron作业,但是不能从命令行启动和停止cron作业。
另外,不能在命令行上创建专用作业并提交给日历。
cron不实施资源限制。
如果作业作为根用户运行,就能够消耗无数的处理器时间和内存。
在实践中,可能希望限制一个作业,以免它影响其他cron作业和系统操作的总体质量。
cron作业严格地与一个调度计划相关联。
例如,无法只在发生某一事件(比如创建一个文件)时启动作业。
从更大的范畴来看,类UNIX系统的许多核心组件都能够根据需要启动其他程序,包括cron、用于网络守护进程的xinetd(或inetd)和init(所有系统进程的起源)。
每个核心组件都有自己的配置文件,所以很难知道哪个组件最适合完成某个修改。
为了克服这些缺点,AppleComputer开发了一个统一的启动工具launchd,它可以在引导时、根据需要和按照指定的时间间隔启动进程。
实际上,在MacOS10.4Tiger中launchd已经替代了cron(和init以及用来引导和初始化系统的其他几个系统实用程序)。
(Apple在系统上保留了cron,以便为用户提供方便,而且Vixiecron的调度选项更灵活)。
MacOSX的引导速度很快确实可以归功于launchd:
它会在引导时列出要启动的程序,但是只在首次需要时执行程序。
launchd是开放源码的,可以从MacOSForge上它的主页获得源代码。
目前,launchd已经被移植到FreeBSD上,但是还没有移植到其他UNIX或Linux系统。
但是,许多项目正在积极地实现与launchd等效的程序,所以简要地了解它的特性是有必要的:
launchd并不创建作业来检查目录中是否有新文件,而是自动监视目录中是否有新文件或者监视空目录中是否添加了任何文件,并根据需要启动作业。
launchd不执行轮询;而是使用kqueues设施让内核在目录发生变化时通知它。
(Linux具有一种相似的事件设施inotify,以后的一篇developerWorks文章将讨论它)。
如果指定了,launchd会使用chroot把您的作业发送到一个新目录。
chroot读作“cha-root”,它是一个系统调用,可以改变前向斜杠(/)和根目录指向的目录。
因此,如果使用chroot把文件发送到/opt/root,/opt/root之外的所有文件就是不可访问的(毕竟,/opt/root现在是/,也就是文件系统的顶级目录),/opt/root中的所有目录成为一级目录。
通常使用chroot限制作业,使代码无法进入更大的文件系统,以避免产生损害。
可以为作业设置资源限制。
可以限制的资源包括内存、堆栈大小和打开的文件的最大数量。
当定义一个任务并把它装载到launchd中之后,可以按照名称从命令行启动和停止作业。
launchd由三个组件组成:
launchd守护进程本身;用来添加、修改和删除作业以及控制launchd的launchctl实用程序;一个或多个配置文件,每个文件定义一个或多个作业。
由于它起源于MacOSX,launchd配置文件只是简单的属性文件,可以用ExtensibleMarkupLanguage(XML)表示。
简单地说,在MacOSX上使用launchd的步骤如下(要监视一个目录中添加的文件并根据需要运行作业):
1.创建一个属性文件来表达此作业及其所有属性。
可以使用Mac的PropertyEditor,也可以手工编辑XML。
无论采用哪种方法,产生的文件都应该与清单1相似。
清单1.监视文件系统目录变化的launchd作业示例简单地说,当/Users/strike/data/incoming目录的内容发生变化时,此文件运行/Users/strike/bin/processor中的实用程序脚本。
把OnDemand设置为True让launchd根据需要启动此作业。
把此文件保存到/Library/LaunchAgents/com.example.processor.plist。
2.用launchctl把此作业装载到launchd中:
%launchctlload/Library/LaunchAgents/com.example.processor.plist如果希望检查最近的操作或查看保存的作业的列表,只需输入launchctllist。
3.要想删除作业,只需带unload选项使用launchctl:
%launchctlunload-w/Library/LaunchAgents/com.example.processor.plist-w的作用是什么?
它完全删除launchd中的作业。
如果没有这个选项,作业会在登录时自动地重新装载(因为作业还在启动代理的用户集合中)。
launchd手册页包含大量信息;如果您是MacOSX用户,还可以找到大量针对launchd的应用程序。
一些聪明的开发人员正在把launchd迁移到更广泛的平台。
使用cron让工作更轻松学习关于使用cron的一些提示和技巧,了解这个守护进程和相似的其他程序为什么是您的好朋友。
提示和技巧下面是关于cron的一些提示、技巧和常见的问题:
与在终端窗口中使用的shell或shell脚本不同,cron并不在crontab文件中就地展开环境变量。
换句话说,如果在crontab中输入:
HOME=/home/joePATH=$HOME/bin:
/usr/bin:
/bin那么PATH并不会设置为您期望的路径。
您必须手工展开所有变量,比如:
HOME=/home/joePATH=/home/joe/bin:
/usr/bin:
/bin但是,因为每个cron命令都由shell执行,所以命令可以引用变量名。
例如,如果在个人crontab中编写以下命令(注意这一行中省略了用户名参数):
daily$HOME/bin/cleanup_daily.sh那么$HOME会正确地展开。
不要把计算密集型任务安排在同一时间启动,比如midnight。
如果可能的话,在凌晨的几小时中分散地启动这些任务,以避免它们争用资源。
正如上面提到的,在默认情况下环境变量SHELL设置为/bin/sh。
如果不修改此变量,crontab中的所有命令都由/bin/sh解释。
但是,如果您不熟悉/bin/sh,更喜欢另一种shell,那么可以设置SHELL并使用这种shell的命令语法。
例如,如果设置SHELL=/bin/zsh,那么所有命令都可以使用Zshell的功能,比如它的高级重定向操作符:
SHELL=/bin/zshdailyuptimedailyweekly在这里,uptime命令的输出覆盖daily文件(daily)并追加到weekly文件中(weekly)。
使用访问控制列表(ACL)/etc/cron.allow和/etc/cron.deny允许或拒绝特定用户运行cron作业。
如果希望把对cron的访问权限制在很少几个用户,那么在/etc/cron.allow中列出这些用户的用户名。
未指定的任何用户都无法使用crontab实用程序提交crontab。
但是,如果希望允许大多数人访问cron而拒绝少数用户,那么在/etc/cron.deny中列出受到限制的用户。
例如,如果/etc/cron.allow的内容如下:
joezelda那么除Joe和Zelda之外任何用户都无法访问cron:
%whoamistrike%crontab/.crontabYou(strike)arenotallowedtousethisprogram(crontab)Seecrontab
(1)formoreinformation再次重申,不要在列表中使用空格。
列表值以逗号分隔。
在Vixiecron中,在范围中不使用日和月份的名称。
要仔细阅读系统的cron文档。
路径、特性和简便措施都可能不一样。
在命令行上输入man5crontab了解crontab文件的语法。
输入man1crontab了解crontab实用程序。
在命令行上输入mancron或man8cron了解cron守护进程本身的选项。
系统管理员最好的朋友cron和与它相似的程序对于系统管理员非常有帮助。
如果您需要反复执行相同任务,就可以考虑用cron实现自动化。
捕捉具有许多步骤的复杂任务常常需要shell脚本,但是许多任务只需要一行命令。
下面仅仅是一些思路:
通过组合使用cron和数据库工具,创建每日转储。
例如,命令:
dailyjoemysqldump-pjoespwdaccounts$HOME/backups/accounts.date+%F.sql每天把数据库accounts转储到一个文件。
嵌入的日期命令(date+%F)确保文件名是惟一的,比如accounts.2008-08-07.sql。
此命令作为用户joe运行,所以用-p指定Joe的密码。
此命令还可以放在Joe自己的crontab中,因为转储需要他的MySQL凭证。
locate子系统为系统上的所有文件编制索引,并把每个文件的完整路径存储在数据库中。
然后,从命令行查询此数据库,就可以立即找到文件。
当然,可以根据需要用find搜索文件,但是必须等待它搜索文件系统,这可能很慢。
为了让定位子系统发挥作用,必须定期为文件系统编制索引,因为随时可能添加和删除文件。
这种情况就非常适合使用cron。
00,12*rootupdatedb这个crontab项每天运行updatedb(locate更新实用程序)两次。
显然很适合用cron实现自动化的另一个任务是,把文件从主服务器复制到众多的从服务器。
rsync是一种跨多个系统分布和同步文件集合的现代实用程序。
许多网管都通过组合使用cron和rsync把网站的主拷贝复制到服务器群中的每台服务器。
midnightwwwrsync-avz/var/www/siteslave1:
/var/www在每天午夜,rsync都会把/var/www/site复制(-avz)到slave1上的/var/www。
使用命令行实用程序mail和shell管道操作符(|)把任务的输出发送给团队中的一个或多个成员。
weeklyrootdf-print-type-local-h|&mail-sWeeklydfreportandybob在这里,每周通过电子邮件把df的输出发送给用户Andy和Bob,让他们能够监视磁盘使用量。
教程结束语无论您是单独使用UNIX系统,还是管理有数百位用户的系统,自动执行维护任务都有助于节省时间、减少错误以及保持机器不间断运行。
cron是在UNIX系统上实现自动化的关键组件,只需发挥一点儿想像力,就可以让计算机为您工作,而不是由您“伺候”计算机。
cron有助于更轻松地完成工作。
现在,您可以睡个好觉了。