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.定时任务脚本中的程序路径用全路径