crond简介
crond是Linux下用来周期性地执行某种任务或等待处理某些事件的一个守护进程,与Windows下的计划任务类似。当安装完成操作系统后,默认会安装此服务工具,并且会自动启动crond进程。crond进程每分钟会定期检查是否有任需要执行的任务,如果有要执行的任务,则自动执行该任务。
Linux下任务调度分为两类,系统任务调度和用户任务调度。
系统任务调度:系统周期性索要执行的工作,如写缓存数据到硬盘、日志清理等。
在/etc目录下有一个crontab文件,此文件就是系统任务调度的配置文件。

上图中SHELL变量指定了系统要使用的Shell;PATH变量指定了系统执行命令的路径;MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量为空,则表示不发送任务执行信息给用户。
用户任务调度:用户定期要执行的工作,如用户数据备份、定时邮件提醒等。用户可以使用crontab工具来定制自己的计划任务。所有用户定义的crontab文件都保存在/var/spool/cron目录中。其文件名与用户名一致。
crontab工具的使用
crontab常用格式
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r|-i]
-u:user:用来指定某个用户的crontab服务,例如,-u ixdba表示设定ixdba用户的crontab任务
-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件
-l:显示某个用户的crontab文件内容。如果不指定用户,则表示显示当前用户的crontab文件内容
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件
-i:在删除用户的crontab文件时给出确认提示
crontab文件的含义
用户所建立的crontab文件中,没遗憾都代表一项任务,每行的每个字段代表一项设置,它的格式共分为6个字段,前五个是时间设定段,第六个是命令段,格式如下:
minute hour day month week commandminute:表示分钟,0~59之间任何整数
hour:表示小时,0~23之间任何整数
day:表示日期,可以是1~31之间任何整数
month:表示月份,可以是1~12之间任何整数
week:表示星期几,可以是0~7之间的任何整数
command:要执行的命令,可以是系统命令,也可以是自己编写脚本文件
以上各字段中还可以使用特殊字符:
型号(*):表示所有可能的值,例如,month字段如果是*,则表示在满足其他字段的制约条件后每月都执行该命令操作
逗号(,):可以用逗号隔开的值指定一个列表范围,如,1,2,5,7,8,9
中杠(-):可以用整数之间的中杠表示一个整数范围,如,2-6表示2,3,4,5,6
正斜线(/):可以用正斜线指定时间的间隔频率,如0-23/2表示每2h执行一次。同时正斜线可以和星号一起使用,如*/10,如果用在minute字段,表示每10min执行一次。
crontab文件举例
每隔3小时执行一次
0 */3 * * * usr/local/apache2/apchectl restart每周六的3:30执行/home/backup.sh脚本
30 3 * * 6 home/backup.sh每月的1号和20号检查磁盘设备
* * 1,20 * * fsck dev/sda1每个月的5号、10号、15号、20号、25号、30号的5:10执行清理Apache日志任务
10 5 */5 * * echo "">/usr/local/apache2/log/access_log使用crontab工具的注意事项
注意环境变量问题
有时创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab中没有配置环境变量引起的。
在crontab文件中定义多个调度任务时,需要特别注意的一个问题就是环境变量的设置。因为手动执行某个任务时,是在当前shell环境下进行的,程序当然能找到环境变量,而系统自动执行某个任务时,是不会加载任何环境变量的,因此,需要在crontab文件中指定任务运行所需的所有环境变量,这样系统执行任务调度时就不会有问题了。
注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都会将任务输出信息通过邮件形式发送给当前系统用户,日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。
例如,可以在crontab文件中设置如下形式,忽略日志输出:
0 */3 * * * /usr/local/apache2/apachectl restart >/dev/null 2>&1
>/dev/null 2>&1表示先将标准输出重定向到/dev/null,然后将标准错误输出重定向到标准输出。由于标准输出重定向到了/dev/null,因此标准错误输出也会重定向到/dev/null,这样日志输出问题就解决了。
系统级任务调度与用户级任务调度
系统级任务调度主要完成一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议),但是反过来却不行。root用户的任务调度操作可以通过crontab-uroot-e来设置,也可以将调度任务直接写入/etc/crontab文件。需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,即使在root用户下创建一个定时重启系统的任务也是无效的。




