说起计划任务,相信大家都应该听过,其实就是给我的计算机设置定时任务,指定时间内去执行相应的操作。

    熟悉windows的朋友都知道,windows下有一项系统功能叫计划任务程序,我们可以通过界面设定在Windows环境下的计划任务。

Linux计划任务之_Crontab    今天我们不谈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计划任务之_Crontab


    Linux下一切皆文件。CROND 是一项系统服务,每分钟都会从配置文件刷新定时任务,并执行计划任务,它是以文件的形式设定定时任务。我们上面使用到的Crontab工具,是用来对定时任务进行调整。

    关于它的配置文件,也就是我们上面案例中写到的【*/1 * * * * date >> /tmp/log.txt】,有着一定的格式要求。

Linux计划任务之_Crontab

    我们再给出几组例子,帮助理解格式

    * 每天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 restart
0,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工具的使用,我们只需要掌握一条命令加四个选项就足够。

[[email protected] ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage:crontab [-u user] file
crontab [-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选项,表明我们可以指定计划任务的所有者。

    案例三: 

多用户同时设定定时任务


Linux计划任务之_Crontab


    这就是Crontab工具的一些基本功能,关于Crontab,还有很重要的一点,它的配置文件。

    在 /etc 目录下:

[[email protected] ~]# cd /etc
[[email protected] etc]# ls cron*
cron.deny  crontab

cron.d:
0hourly  raid-check  sysstat

cron.daily:
cups  logrotate  makewhatis.cron  mlocate.cron  prelink  readahead.cron  tmpwatch

cron.hourly:
0anacron

cron.monthly:
readahead-monthly.cron

cron.weekly:

Linux计划任务之_Crontab

    -1>打开文件 crontab<这是Crontab的全局配置文件>

Linux计划任务之_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整理