一、crond简介
crond是linux下用来周期性的执行某种任务或者等待处理某些事件的一个守护进程,如有要执行的任务,则自动执行。
Linux下的任务调度分两类,系统任务调度和用户任务调度
系统任务调度:系统周期性的所要执行的工作,比如写缓存数据到硬盘,日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件
/etc/crontab
cat /etc/crontab //运行环境变量
SHELL=/bin/bash //指定系统要用哪个shell,这里是bash
PATH=/sbin:/bin:/usr/bin //制定了系统执行命令的路径
MAILTO= //指定crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户
HOME=/ //指定了在执行命令或者脚本时使用的主目录
#run-parts
30 * * * * root run-parts/etc/cron.hourly
20 9 * * * root run-parts/etc/cron.daily
28 5 * * 0 root run-parts/etc/cron.weekly
35 8 1 * * root run-parts/etc/cron.monthly
用户任务调度:用户要定期执行的工作,比如用户数据备份,定时邮件提醒等。用户可以使用crontab工具来制定自己的计划任务。所有用户定义的crontab文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。
文件:/etc/cron.deny 说明:该文件中所列用户不允许使用crontab命令
文件:/etc/cron.allow 说明:该文件中所列用户不允许使用crontab命令
文件:/var/spool/cron 说明:所有用户的crontab文件存放的目录,以用户名命名
crontab参数解析:六列(分钟 小时 日期 月份 星期 要执行的命令)
minute:分钟,0-59之间的任何整数
hour:小时,0-23之间的任何整数
day:日期,1-31之间的任何整数
month:月份,1-12之间的任何整数
week:星期几,0-7之间的任何整数,0或7代表星期日
command:要执行的命令,可以使系统命令,也可以是自己编写的脚本文件
特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示满足其他字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如“1,2,4,5,8”。
中杠(-):可以用整数之间的中杠表示是一个整数范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的频率,例如“0-23/2”表示每两小时执行一次,同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
二、crond服务
安装crontab:yum install crontabs
服务操作:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
/sbin/service crond status //服务状态
查看crontab服务是否设置为开机启动,执行命令:ntsysv
加入开机自动启动:chkconfig -level 35 on
三、命令详解
crontab [-u user] file
crontab [-u user][-e | -l | -r]
通过crontab命令,我们可以在固定的时间间隔执行指定的系统命令或shell script脚本。时间单位是分钟、小时、日、月、周、及以上的任意组合。
-u user:用来设定某个用户的crontab服务,例如,“-u xjl”表示设定xjl用户的crondtab服务,此参数一般由root用户来运行。
file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果命令行中没有指定这个文件,crontab命令将接受标准输入(键盘上的)命令,并将它们载入crontab。
-e:编辑某个用户的crontab文件内容,如果在不指定用户,则将编辑当前用户的crontab文件。
-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。
-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
-i:在删除用户的crondtab文件时给确认提示。
(1)、创建一个新的crontab文件
在考虑cron进程提交一个crontab文件前,首先要设置环境变量EDITOR。cron进程根据它来确定是用哪个编辑crontab文件。在$HOME .profile文件加入
EDITOR=vi; export EDITOR
然后保存并退出。不妨创建一个名为<user>cron的文件,<user>是用户名,例如,davecron,加如下内容
0,15,30,45 18-06 * * * /bin/echo 'date' > /dev/console 6pm-6am每隔十五分钟向控制台输出一次时间
在上面的例子中,系统将每隔1 5分钟向控制台输出一次当前时间。如果系统崩溃或挂起,从最后所显示的时间就可以一眼看出系统是什么时间停止工作的。在有些系统中,用tty1来表示控制台,可以根据实际情况对上面的例子进行相应的修改。为了提交你刚刚创建的crontab文件,可以把这个新创建的文件作为cron命令的参数
$ crontab davecron
现在该文件已经提交给cron进程,它将每隔1 5分钟运行一次。同时,新创建文件的一个副本已经被放在/var/spool/cron目录中,文件名就是用户名(即dave)。
(2)、列出crontab文件
$ crontab -l
对crontab做备份 $ crontab -l > $HOME/mycron
(3)、编辑crontab文件
$ crontab -e
vi 进入编辑
(4)、删除crontab文件
$ crontab -r
(5)、恢复丢失的crontab文件
加入$HOME下有备份,可以拷贝到/var/spool/cron/<username>其中<username>是用户名
如果权限有问题,可以 $ crontab <filename>,其中<filename>是你在$HOME中副本的文件名
使用实例
实例1:
命令:3,15 8-12 */2 * * connand 每隔两天的上午8点到11点的第3和第15分钟执行
实例2:
命令:15 8 * * 6,0 /etc/init.d/smb restart 每周六周日的8:15重启smb
四、注意
1、注意环境变量的问题
有时我们创建了一个crontab,但是这个任务却无法执行,手动执行时却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。手动执行某个任务时,是在当前shell环境下执行的,程序可以找到环境变量,而系统自动执行任务调度时,是不会加载任何环境变量的,因此就需要在crontab文件中指定任务所需的所有环境变量,就没问题了。
注意以下三点:
1)脚本设计文件路径是要写全局路径
2)脚本涉及到Java或者其他变量时,通过source命令引入环境变量,如:
cat start_cbp.sh
#!/bin/sh
source /etc/profile
export RUN_CONF=/home/xjl/conf/platform/cbp/cbp_jboss.conf
/usr/local/jboss-4.0.5/bin/run.sh -c mev &
3)当手动执行脚本ok,但是crontab死活不执行时,这是必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0 * * * * ./etc/profile;/bin/sh /var/www/java/audit_no_count/bin/restart_audit.sh
2、注意清理系统用户的邮件日志
每条任务调度执行完毕,系统都将任务输出信息通过电子邮件的形式发送给当前用户,日积月累,日志信息会非常大,可能会影响系统的正常运行,因此,将每条任务进行重定向处理非常重要。如:
0 */3 * * * /usr/local/apache/apachectl restart >/dev/null 2>&1
"/dev/null 2>&1"表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经到了/dev/null,因此标准错误也会重定向到/dev/null,这样日志的输出问题就解决了。
3、系统级任务调度和用户级任务调度
用户级任务调度可以放到系统级任务调度来完成(不建议),但反之不行,root用户的任务调度操作可以通过“crontab -uroot -e”来设置,也可以将调度任务直接写入/etc/crontab文件。需要注意的是,如果要定义一个定时重启系统的任务,就必须将任务放到/etc/crontab文件,就是用户root下创建一个定时重启任务也是无效的。
4、其他注意
1)新建的cron job不会马上执行,至少要过两分钟才执行,如果重启则马上执行。
2)当crontab突然失效时,可以说尝试/etc/init.d/crond restart解决问题或者查看某个日志job没有执行/报错tail -f /var/log/cron。
3)千万别乱运行crontab -r。它从crontab目录(/var/spool/cron)中删除crontab文件,删除了,该用户的所有crontab都没了。
4)在crontab中%号是有特殊含义的,表示换行的意思。如果要用的话就必须进行转义\%,如经常date'+%Y%m%d'在crontab里是不会执行的,应换成date'+\%Y\%m\%d'。