cron是linux系统下一个自动执行指定任务的程序,即包含“时间”、“路径”、“自动执行脚本”等要素
当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab。但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的。
每个用户都会生成一个自动生成一个自己的crontab文件,一般位于/var/spool/cron目录下
所以cron自动执行有三种方式
1.直接crontab -e编辑用户目前的crontab
将45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 写入即可
2.将执行的任务以脚本的形式存放在/etc/cron.d下
3.直接将运行的程序写在用户的配置文件里边。
比如像让root用户执行一个cron任务
可以在/var/cron/tabs/目录下边创建一个文件root,将45 4 1,10,22 * * /usr/local/etc/rc.d/lighttpd restart 写入root文件,保存退出即可
注意root是一个文件,不是目录。
一、cron服务介绍
cron把命令行保存在/etc/crontab文件里,每个系统用户如果设置了自己的cron,那都会在/var/spool/cron下面有对应用户名的crontab。无论编写/var/spool/cron目录内的文件还是/etc/crontab文件,都能让cron准确无误地执行安排的任务,区别是/var/spool/cron下各系统用户的crontab文件是对应用户级别的的任务配置,而/var/crontab文件则是对应系统级别的任务配置。cron服务器每分钟读取一次/var/crontab/cron目录内的所有文件和/etc/crontab文件。
二、使用cron服务执行计划任务
#service crond start/restart/stop
启动/重启/关闭cron服务
#crontab -l
浏览当前用户的crontab,即浏览已存在的计划任务列表
#crontab -e
编辑当前用户crontab,如之前从未编辑过crontab文件,那么crontab是一个空白文件,我们可以完全手工编写我们所需要的计划任务列表,下面详细介绍计划任务列表的写法。
以下是几个例子:
1)9 9 * * * /usr/local/bin/cvsb
2)3 3 * * 0 /usr/local/bin/qbbak
3)* */6 * * * /usr/local/bin/esbbak
4)20,30 * * * /usr/local/bin/esbak
5)* 23 * * 2-5 /usr/local/bin/esbbak
六个字段对应的含义如下:
9 9 * * *
分钟 小时 日期 月份 星期
1)表示每天早上9点9分执行目录/usr/local/bin/中的cvsb文件
2)表示每周日凌晨3时3分执行目录/usr/local/bin中的qbbak文件
3)表示每6小时执行一次,执行时间从第一次执行起计算,当然也可以自定义执行时间,比如0 */6 * * *那程序就会在整点执行
4)表示在每小时20分和30分时执行
5)表示在星期二到星期五每天的23点执行
上面简单介绍了cron的一些基本用法,这个东东的时间组合可不是一般的强~可以复杂到你无法想象,我们只要掌握少许基本就可以满足日常需求了。
三、cron进阶使用
1.避免cron产生垃圾文件
细心的朋友可能会发现系统/var/spool/clientmqueue/目录下往往存有大量文件,原因是系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail(系统自带的邮件服务器)没有启动所以就产生了这些文件。
这时可以使用输出重定向,即在计划任务后加上> /dev/null 2>&1
例:
9 9 * * * /usr/local/bin/cvsb > /dev/null 2>&1
2>&1:把错误重定向到输出要送到的地方。
把命令的执行结果重定向到/dev/null,即把产生的错误抛弃。
2.一种经常碰到的情况,需要执行的文件没问题,但通过cron就是死活不能正确执行,这时我们可以通过输出重定向将cron的执行过程输出到一个文件,通过分析执行过程来寻找错误的原因
例:
9 9 * * * /usr/local/bin/cvsb > /var/log/crontab_log 2>&1
上例将cron的执行过程输出到一个文本文件crontab_log,这个文件可以随便手动建一个,放在哪都行,重定向目录写对就Ok。
网上查询到的资料crontab不执行的问题:
第一,脚本的原因:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到 70%以上。因为程序执行到某一步导致crontab终止执行,我就碰到一次在迁移代码的时候将数据库连错了。导致无法访问而死在那里了。
第二,执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们 手动执行成功而crontab不能执行的时候,笔者碰到一次就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile
第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********
第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。
第六,crontab不执行的问题困扰了好长时间,脚本写的都正确,但是就是不执行,最终解决方法如下:
crontab -u root /var/spool/cron/root
这样root用户的crontab就生效了
service crond restart
重启下服务就好了
第七,crond没有启动
第八,脚本编码问题,脚本在window下编写,传到linux下后报“锘?!/bin/bash”,用vi编辑器新建新shell脚本,输入内容后保存