说起计划任务,相信大家都应该听过,其实就是给我的计算机设置定时任务,指定时间内去执行相应的操作。
熟悉windows的朋友都知道,windows下有一项系统功能叫计划任务程序,我们可以通过界面设定在Windows环境下的计划任务。
今天我们不谈Windows,重点在Linux服务器上。Windows和Linux在应用过程中最大的区别,在于Windows是更加贴近于用户的,而Linux主要负责管理服务器的工作。相对来说,Linux对计划任务的要求应该更为多一些。
例如,我们需要每分钟执行一次程序,检查系统运行状态,每星期要进行日志备份,每月要进行数据库的备份。诸如此类大量频繁的任务依靠人来做确实不太现实。
如何在Linux中使用计划任务呢?这里就要用到Linux下的工具Crontab。
首先这里我们需要记住两个概念:周期性执行的任务我们称为CronJob,周期性执行的任务列表我们称为Crontable。
环境:VMware10,Linux版本型号CentOS6.5。远程工具 X_Shell5
首先,安装并检查Crontab工具
安装:
- yum install vixie-cron- yum install crontabs
检查:
- crontab -l #检查Crontab工具是否安装- service crond status #检查crond服务是否启动- service crond #查询crond服务可以使用的命令
在一些版本的Linux中,Crontab工具是默认安装的(当然,这与你安装Linux时选择哪种安装也是有关系的,最小系统安装默认不会安装该工具),如果没有的话,搭建yum源本地安装即可。
接下来,这里我们先给一个小案例。
案例一:
每分钟都打印当前时间到一个日志文件中
*********date >> /tmp/log.txt
- crontab -e #打开计划任务
#写入
*/1 * * * * date >> /tmp/log.txt
# 保存退出
- crontab -l #打印计划任务
- tail -f /tmp/log.txt #动态刷新log.txt文件的最后一行
上面的案例给出的是最简单的计划任务,每分钟将时间打印到/tmp/log.txt中。可以发现,Crontab工具使用起来并不是相当复杂。
接下来,我们聊一聊Crontab的基本组成。
Linux下一切皆文件。CROND 是一项系统服务,每分钟都会从配置文件刷新定时任务,并执行计划任务,它是以文件的形式设定定时任务。我们上面使用到的Crontab工具,是用来对定时任务进行调整。
关于它的配置文件,也就是我们上面案例中写到的【*/1 * * * * date >> /tmp/log.txt】,有着一定的格式要求。
我们再给出几组例子,帮助理解格式
* 每天10:30重启apache服务
30 10 * * * service httpd restart
* 每月1、10、22日4:45重启apache
45 4 1,10,22 * * service httpd restart
* 每月1到10日4:45重启apache
45 4 1-10 * * service httpd restart
* 每隔两分钟重启apache服务
*/2 * * * * service httpd restart
* 每奇数分钟重启apache服务
1-59/2 * * * * service httpd restart
* 晚上11点到早上7点之间,每隔一小时重启apache
0 23-7/1 * * * service httpd restart
* 每天18点到23点之间每隔30分钟重启apache
0-59/30 18-23 * * * service httpd restart0,30 18-23 * * * service httpd restart
有特别注意:
1、Crontab共有秒,分钟,小时,天,月,星期 五个域,出第三域和第五域之间执行的是“或”操作,其余都执行的是“与”操作。
2、命令行双引号中使用%时,需要加反斜线 \
案例二:
计划任务:四月的第一个星期天早晨1时59分运行a.sh
错误命令:
59 1 1-7 4 0 /root/a.sh
执行结果:四月的1-7号和四月的每个周天的1:59都执行该命令
修 正:
59 1 1-7 4 * test `date +\%w` -eq 0 && /root/a.sh
关于Crontab工具的使用,我们只需要掌握一条命令加四个选项就足够。
[root@localhost ~]# crontab --helpcrontab: invalid option -- '-'crontab: usage error: unrecognized optionusage:crontab [-u user] filecrontab [-u user] [ -e | -l | -r ](default operation is replace, per 1003.2) -e (edit user's crontab) -l (list user's crontab) -r (delete user's crontab) -i (prompt before deleting user's crontab) -s (selinux context)
-u:指定计划任务分配的用户,默认是当前登录用户
-e:编辑计划任务
-l:列出用户的计划任务
-r:删除用户的计划任务
细心的话可以注意到这里有-u选项,表明我们可以指定计划任务的所有者。
案例三:
多用户同时设定定时任务
这就是Crontab工具的一些基本功能,关于Crontab,还有很重要的一点,它的配置文件。
在 /etc 目录下:
[root@localhost ~]# cd /etc[root@localhost etc]# ls cron*cron.deny crontabcron.d:0hourly raid-check sysstatcron.daily:cups logrotate makewhatis.cron mlocate.cron prelink readahead.cron tmpwatchcron.hourly:0anacroncron.monthly:readahead-monthly.croncron.weekly:
-1>打开文件 crontab<这是Crontab的全局配置文件>
在该全局的配置文件中也可以添加新的系统级别的计划任务。(需要指定用户)
- */1 * * * * root echo “root->cron/crontab”
MAILTO表示的是计划任务改变之后生成日志的发送对象。
-2>进入配置文件cron.d
- cd cron.d- ls- cat sysstat
crontab 在载入配置文件的过程中,会把sysstat文件中的配置信息载入成root用户的计划任务。
但crontab -e 修改内容,不会改变sysstat配置文件中的信息。直接修改sysstat配置文件中的信息,不会直接载入到crontab中,可以使用命令
crontab sysstat
将配置文件中的内容导入crontab中。这会覆盖原来crontab -e中的全部内容
-3>
/etc/cron.d/sysstat 文件中有注明的用户名,在目录 /etc/cron.d 下的所有文件,都可以认为是系统配置文件的补充。
也可以在该目录下自己创建文件,写相应的计划任务,同样需要注明用户。不需要载入,就可以执行该计划,而且该计划并没有放到 crontab -l -u user中。因此说明,crontab工具不可以编辑系统级别的计划任务。
-4>补充
crontab -e写入的定时任务,以及crontab -l列出的定时任务,保存在文件 /var/spool/mail/”user”文件中.不同用户对应不同的子文件夹
cat /var/spool/mail/root
----------------------------------------------------------------------------------------------
Crontab到这里基本已经结束了,这里还有最后一个问题。
Crontab最小只能设置到每分钟执行一次命令,如果想半分钟执行某个命令怎么做的?
Linux下有条系统命令 sleep,可以让程序停止一段时间,如何通过这条系统命令实现小于一分钟的定时任务呢?
案例四:
计划任务:每半分钟执行一次 将date打印到/tmp/date.log
执行命令:
*/1 * * * * date >> /tmp/date.log*/1 * * * * sleep 30s;date >> /tmp/date.log
-------muhuizz整理
本文出自 “暮回” 博客,请务必保留此出处http://muhuizz.blog.51cto.com/11321490/1868839