Crond服务

Crond是linux系统中用来定期执行命令或者制定任务的一种服务或者软件。一般安装centos5或者centos6系统的时候,crond就会默认存在了。Crond服务默认每分钟会检查系统是否有需要执行的定时任务,如果有的话就会根据实现定义好的规则来执行这个定时任务。Crond服务就像闹钟一样,准确高效的执行着预先设定好的任务,帮助我们解决企业中许多定时任务问题。但是秒级的定时任务,crond却无能为力,不过却可以通过一下的方法来解决秒级定时任务。

    1.自己为守护进程写shell循环

    2.Quartz也能实现秒级定时任务

   crond定时任务分为两种,一种是系统本身的定时任务,一种是系统用户需要执行的定时任务。这两种定时任务,大致内容相同,但是命令格式有一些差异。

    系统本身定时任务在/etc/crontab中,分为7部分,命令格式如下

    # Example of job definition:

    # .---------------- minute (0 - 59)

    # |  .------------- hour (0 - 23)

    # |  |  .---------- day of month (1 - 31)

    # |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...

    # |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat

    # |  |  |  |  |

    # *  *  *  *  * user-name command to be executed

用户定时任务同系统本身的定时任务相比,由于用户是确定的,所以缺少了用户部分,不过也可以通过crontab -u 指定定时任务的用户。

    和crontab设定定时任务类似的命令还有at,anacron等,下面就简单比较一下他们的不同点:

    

    1.at适合执行一次就结束的服务,突发性任务。了解即可

    2.Anacron适合非7*24小时开机的服务器准备的。系统开机执行的,检测停机期间有没有执行的任务,开机执行一遍。

    3.Crond服务是工作中非常重要的服务器,at和anacron很少使用

    配置crond服务的命令就是crontab,下面介绍一下crontab命令的用法

    crontab

    参数:

    -l 查看crontab文件内容

    -e 编辑crontab文件内容

    -i 删除crontab文件内容时,会提示确定删除

    -r 删除crontab文件内容

    -u 指定执行定时任务的用户

注意:-i,-r在生产环境中比较少用,没有特殊需求,尽量用-e编辑crontab内容

    cron定时任务存放在/var/spool/cron/root中(root是设定定时任务的用户名,如果用户是abc,那么存放用户abc定时任务的路径就是/var/spool/cron/abc),系统本身的定时任务存放在/etc/crontab中。crond的日志存放路径/var/log/cron。

     

    

易错点:

* */2 * * * cmd

这个是每隔两个小时的每分,不是每隔两个小时,定时任务一定要注意下级时间位的参数

    书写定时任务要遵循一下规范,可以避免不必要的错误发生。

        

1.注意系统变量问题

crond只能识别少量的环境变量,所以最好在执行定时任务时,导入所需的时间变量,避免错误 

2.定时任务要用绝对路径

3.脚本权限问题加/bin/sh

由于脚本一般需要执行权限(x),为了保证定时任务的顺利运行,可以用/bin/sh  脚本

[root@localhost ~]# touch test.sh
[root@localhost ~]# echo 'echo "hello world"' >>test.sh
[root@localhost ~]# cat test.sh 
echo "hello world"
[root@localhost ~]# ./test.sh
-bash: ./test.sh: 权限不够
[root@localhost ~]# /bin/sh test.sh 
hello world
[root@localhost ~]#

4.时间变量问题要加反斜线\

举个例子,下面两个定时任务,第一个定时任务可以正常执行,第二条则有错误

[root@localhost ~]# ls
anaconda-ks.cfg  backup_2015-11-15.tar.gz  install.log  install.log.syslog  oldboy.txt
[root@localhost ~]# ls /tmp
test.txt  yum.log
You have mail in /var/spool/mail/root
[root@localhost ~]# crontab -l
* * * * * tar zcvf ~/backup_$(date +\%F).tar.gz /etc/services
* * * * * tar zcvf tmp/backup_$(date +%F).tar.gz /etc/services
[root@localhost ~]# 
可以看下cron日志的信息:
Nov 15 23:22:01 localhost CROND[1591]: (root) CMD (tar zcvf tmp/backup_$(date +)
Nov 15 23:22:01 localhost CROND[1590]: (root) CMD (tar zcvf ~/backup_$(date +%F).tar.gz /etc/services)
可以看出第二条的定时任务支执行了tar zcvf tmp/backup_$(date +,所以没有成功

5.>/dev/null 2>&1 问题

[root@localhost ~]# ll /var/spool/clientmqueue/
总用量 0
[root@localhost ~]# ll /var/spool/clientmqueue/
总用量 0
[root@localhost ~]# crontab -e
#just a test
* * * * * /bin/sh /root/test.sh
#* * * * * /bin/sh /root/test.sh >/dev/null 2>&1
[root@localhost clientmqueue]# ll /var/spool/clientmqueue
total 8
-rw-rw----. 1 smmsp smmsp  12 Nov 15 23:40 dftAFFe1Mb002022
-rw-rw----. 1 smmsp smmsp 810 Nov 15 23:40 qftAFFe1Mb002022

如果定时任务末尾不添加>/dev/null 2>&1,在系统sendmail服务未开启的情况下,/var/spool/clienmqueue会生成许多临碎的文件,容易导致相应的磁盘分区inode资源耗尽。所以在执行脚本的定时任务后要追加>/dev/null 2>&1来防止这个问题。

6.定时任务加注释

7.使用脚本代替定时任务命令

8.避免不必要的程序输出

在第4条例子中

* * * * * tar zcvf ~/backup_$(date +\%F).tar.gz /etc/services
tar -v的选项就是没有意义的

9.切记打包时在目标目录上一级打包

在第4条例子中

* * * * * tar zcvf ~/backup_$(date +\%F).tar.gz /etc/services

打包的路径就包含了/,解压的时候就容易覆盖/目录导致不可挽救的后果

所以正确的应该入下:

[root@localhost ~]# cat b.sh
cd /etc
tar zcvf back_$(date +%F).tar.gz ./services
[root@localhost ~]# crontab -l
00 00 */1 * * /bin/sh /root/b.sh >/dev/null 2>&1
[root@localhost ~]#

10.定时任务脚本中的程序路径用全路径