Linux运维学习笔记之七:定时任务crond 服务

来源:互联网 发布:mac c语言编程软件 编辑:程序博客网 时间:2024/05/17 22:54


第十四章 定时任务crond 服务

一、crond概念

crond是Linux系统中用来定期执行命令或指定程序任务的一种服务(软件)。

crond服务默认情况是每分钟执行,服务会每分钟检查系统中是否有需要执行的定时任务,如果有,则根据事先定义好的规则来执行这个定时任务。

crond服务最小时间是分钟,秒级任务crond服务自身无能为力,但可通过方法来实现。

Linux如查要实现秒级任务的方法:

(1)自已写守护进程

(2)自己写shell循环

(3)Quartz来实现

(4)在crond服务中加入sleep 数字来实现

        例:* * * * * sleep 3; /bin/date

二、crond服务的作用

一般运维要求:

7*24小时提供服务,是一般网站的基本特征。

重要数据需每天备份。

凌晨备份,持续是间长

crond服务==闹钟

三、Linux系统定时任务的分类

1、系统自身定时执行的任务

ll /etc/ | grep cron

-rw-------.  1 root root    541 Nov 23 2013 anacrontab

drwxr-xr-x.  2 root root   4096 Jan 2 13:23 cron.d

drwxr-xr-x.  2 root root   4096 Jan 1 23:59 cron.daily

-rw-------.  1 root root      0 Nov 23 2013 cron.deny

drwxr-xr-x.  2 root root   4096 Jan 1 23:43 cron.hourly

drwxr-xr-x.  2 root root   4096 Jan 1 23:58 cron.monthly

-rw-r--r--.  1 root root    457 Sep 27 2011 crontab

drwxr-xr-x.  2 root root   4096 Sep 27 2011 cron.weekly

2、用户定时执行的任务

crontab -l

#time sync by mybjb at 2017-01-23

*/10 * * * * /usr/sbin/ntpdate 210.72.145.44 > /dev/null2>&1

四、常用用用户定时任务命令

1、at:适合执行一次就结束的调度任务(突发性任务,不重要)
(1)需要atd服务

chkconfig --list atd

atd    0:off   1:off  2:off   3:off   4:off  5:off   6:off

(2)格式:

at [参数] [时间]
at> 执行的指令
退出at命令 ctrl+d

(3)参数:

-m :当指定的任务被完成之后,将给用户发送邮件,即使没有标准输出
-I :atq的别名
-d :atrm的别名
-v :显示任务将被执行的时间
-c :打印任务的内容到标准输出
-V :显示版本信息
-q :后面加<列队> 使用指定的列队
-f :后面加<文件> 从指定文件读入任务而不是从标准输入读入
-t :后面<时间参数> 以时间参数的形式提交要运行的任务

(4)时间格式:
a、HH:MM

说明:在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此任务。

ex> 04:00

b、HH:MM YYYY-MM-DD

说明:规定在某年某月的某一天的特殊时刻进行该项任务

ex> 04:00 2009-03-17

c、HH:MM[am|pm] [Month] [Date]

说明:规定在某年某月某日的某时刻进行该项任务

ex> 04pm March 17

d、HH:MM[am|pm] + number[minutes|hours|days|weeks]

说明:规定在某个时间点再加多少时间后才进行该项任务

ex> now + 5 minutes

ex> 04pm + 3 days

(5)示例

例1:三天后的下午 5 点锺执行 /bin/ls

# at 5pm + 3 days

at> /bin/ls

at> ctrl+d

 

例2:明天17点钟,输出时间到指定文件内

# at 17:20 tomorrow

at> date > /root/doiido.log

at> ctrl+d

2、anacron:适合于非7*24小时开机的服务器(如开机执行,不重要)

会检测停机期间没有执行的任务,在开机后一次性执行一遍。

(1)配置文件 /etc/anacrontab
(2)格式:

period   delay   job-identifier  command

period — 命令执行的频率(天数)

delay — 延迟时间(分钟)

job-identifier — 任务的描述,在目录/var/spool/anacron中生成一个以job-identifier命名的时

间戳文件的名称,只能包括非空白的字符(除斜线外)。

command — 要执行的命令

(3)启动/停止服务

/sbin/service anacron start    启动该服务  

/sbin/service anacron stop    停止该服务

(4)示例

cat /etc/anacrontab

#period   delay  job-identifier    command

1            5      cron.daily       nice run-parts /etc/cron.daily

7            25     cron.weekly      nice run-parts /etc/cron.weekly

@monthly    45      cron.monthly     nicerun-parts /etc/cron.monthly

注:monthly 就是一个月( 30 天)

3、crontab

crond是守护进程,crondtab是命令

(1)语法 crontab(选项)(参数)
(2)选项

-e:编辑该用户的计时器设置(查看的文件是/var/spool/cron/<用户名称>,会进行语法检查);  

-l:列出该用户的计时器设置(查看的文件是/var/spool/cron/<用户名称>);

-r:删除该用户的计时器设置;

-u <用户名称>:指定要设定计时器的用户名称。

(3)系统任务调度

a、配置文件: /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=""

HOME=/

# run-parts

51 * * * * root run-parts /etc/cron.hourly

24 7 * * * root run-parts /etc/cron.daily

22 4 * * 0 root run-parts /etc/cron.weekly

42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置crond任务运行的环境变量,

第一行SHELL变量指定了系统要使用哪个shell,这里是bash

第二行PATH变量指定了系统执行命令的路径

第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户

第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。

run-parts表示后面接的是文件夹,要执行该文件夹内所有脚本。如果不写run-parts,则要直接写命令或脚本的全路径。

b、查看/etc/crontab文件

cat /etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

 

# For details see man 4 crontabs

 

# 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 beexecuted

(4)、用户任务调度

a、配置文件:

所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,

b、使用者权限文件如下:

/etc/cron.deny 该文件中所列用户不允许使用crontab命令

/etc/cron.allow 该文件中所列用户允许使用crontab命令

/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名

c、查看root用户定时任务文件

cat /var/spool/cron/root

#time sync by myLinux93.85 at 2017-01-05

*/60 * * * * /usr/sbin/ntpdate 10.108.68.100 > /dev/null2>&1

4、crontab使用格式
(1)系统定时任务格式

a、系统定时任务规则格式分为7段,用空格分隔。

前5段为时间设定段,第6段为用户名,第7段为所要执行的命令或脚本任务。

b、基本格式:

* * * * * user cmd

c、说明:

cmd可以是命令或脚本的全路径,也可以是run-parts文件夹。

系统定时任务配置文件/etc/crontab只能由root用户修改。

 

(2)用户定时任务格式

a、用户定时任务规则格式分为6段,用空格分隔。

前5段为时间设定段,第6段为所要执行的命令或脚本任务。

b、基本格式:

* * * * * cmd    # minute |hour | day of month | month | day of week | command

c、说明:

(i)cmd为要执行的命令或脚本,必须要写全口含路径。如/bin/sh  /wddg/test.sh。

(ii)每段之间必须要有一个空格。

(iii)时间段记忆口决:分时日月周

(iv)周和日尽量不要同时用,否则可能达不到想要的效果。

(v)cmd命令最好在命令行用tab补全后复制,

d、符号含义:

*:星号,表示任意时间。

分位是*表示每分(等价于00-59),时位*表示每小时(等价于00-23),同理,每天,每月,每周。

00 23 * * * cmd 表示每天23:00执行cmd

-:减号,分隔符,表示一个时间范围或区间段。

如时位17-19表示每天17、18、19点。

00 17-19 * * * cmd 表示每天17:00、18:00、19:00分别执行cmd

,:逗号,表示枚举分隔时段,可以和“-”同时使用。

如17,20,22表示每天17点,20点,22点。

30 3-5,17-19 * * * cmd 表示每天3:30、4:30、5:30、17:30、18:30、19:30分别执行cmd

/n:n代表数字,表示每隔n单位时间。

如分位上是*/10,表示每10分钟,也可写为0-59/10

* */4 * * * cmd 表示每4小时执行一次cmd。

5、crontab依赖的服务

chkconfig --list crond

crond           0:off   1:off  2:on    3:on    4:on   5:on    6:off

/etc/init.d/crond status

crond (pid  3170) isrunning...

6、crontab示例
(1)编辑用户定时任务(root和指定用户)

root用户:

crontab -e

#每小时查看磁盘空间情况,写入/wddg/df.log文件中

00 * * * * /bin/df -h >> /wddg/df.log  

指定用户:

crontab -u wddg -e 

(2)每天凌晨3:30和中午12:30执行/wddg/test.sh脚本

30 3,12 * * * /bin/sh /wddg/test.sh

(3)每6小时的半点执行执行/wddg/test.sh脚本

30 */6 * * * * /bin/sh /wddg/test.sh

(4)每天8-18点之间每2小时的半点执行/wddg/test.sh脚本

30 8-18/2 * * * /bin/sh /wddg/test.sh

(5)每天21:30重启apache服务

30 21 * * * /var/apache/bin/apachectl graceful

(6)每月的1、10、22号的凌晨4:45分重启apache服务

45 4 1,10,22 * * /var/apache/bin/apachectl graceful

(7)每周六、日的凌晨1:10分重启apache服务

10 1 * * 6,0 /var/apache/bin/apachectl graceful

(8)每天的18-23点的整点和半点(也可以说每隔30分钟)重启apache服务

0,30 18-23 * * * /var/apache/bin/apachectl graceful

(9)每小时的整点重启apache服务

00 */1 * * * /var/apache/bin/apachectl graceful

(10)晚上23点和早上0-7点的每分钟都重启apache服务

* 23,00-07/1 * * * /var/apache/bin/apachectl graceful

    这题的结果是不规范的,也是不对的。并不表示晚上23点和早上0-7点的每小时都重启apache服务。由于第1列是*,表示是每分钟都执行。

(11)每年4月的每周一到周三每天上午11:00重启apache服务

00 11 * 4 1-3 /var/apache/bin/apachectl graceful

(12)每分钟打印一次自已的姓名到/wddg/log/name.log文件中

crontab -e

#print name to /wddg/log/name.log

* * * * * /bin/echo 'wddg' >> /wddg/log/name.log                                             

(13)每周六、周日上午9:00和下午14:00通过脚本打印当天日期,格式yyyy-mm-dd

vi /wddg/printDate.sh

echo `date '+%Y-%m-%d'` >> /wddg/log/date.log > /dev/null2>&1 #%F也可以

crontab -e

#print date /wddg/log/date.log

00 09,14 * * 0,6 /bin/sh /wddg/printDate.sh   

crontab -l

7、crontab日志
日志文件位置/var/log/cron*

ll /var/log/cron*

-rw-------. 1 root root 280238 Jan 25 09:45 /var/log/cron

-rw-------. 1 root root 577110 Jan 1 03:16 /var/log/cron-20170101

-rw-------. 1 root root 585344 Jan 8 03:52 /var/log/cron-20170108

-rw-------. 1 root root 597732 Jan 15 03:49 /var/log/cron-20170115

-rw-------. 1 root root 593889 Jan 22 03:20 /var/log/cron-20170122

五、crontab书写注意事项(生产环境定时任务专业写法)

(1)写为定时任务时要加上必要的注释(最好是英文注释,Linux对中文支持不好)。

格式:什么人、什么时间、因为什么(需求方)、做了什么事。可以让人容易理解任务的信息,提升工作效率。

(2)执行shell脚本任务前加/bin/sh

因为创建的新文件默认权限是644,有时候,忘了为脚本设置可执行权限(x),结果任务无法执行。加上/bin/sh可以保证任务正常执行。

(3)在执行shell脚本的定时任务结尾加>/dev/null2>&1

a、标准输入输出设备

/dev/null:是系统的空设备(也就是黑洞)

0:表示标准输入

1:表示标准输出

2:表示标准错误

b、重定向

2>&1 :把标准错误重定向到标准输出

>/dev/null 2>&1等价于1>/dev/null 2>/dev/null也等价于&>/dev/null

c、邮件服务容易导致邮件临时目录中小文件过多

由于CentOS5.x默认安装并开启邮件服务,如查不加>/dev/null 2>&1,有可能产生大量输出信息,导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量inode节点。CentOS6.x虽然默认不安装邮件服务,但有可能以后会手动安装邮件服务,也会导致上述问题。

具体过程如下:

当定时任务执行时,会根据/etc/crontab文件中MAILTO="root"这个配置选项给系统发一封邮件。Linux系统默认邮件服务是sendmail,经常是关闭的,所以定时任务发送的邮件就会临时堆在/var/spool/clientmqueue目录中,时间长了该目录下的小文件会有委多,导致inode消耗完了,无法写文件了。

d、文件过多时,rm –f * 删除会报文件过多错误,需用ls(或find )| xargs rm –f来删除。

e、定时任务执行的如果是命令,并肯已经有重定向或追加符号的,一般要测试一下加与不加>/dev/null 2>&1,看具体执行结果,有时是不行的。

(4)在指定用户下执行相关定时任务
(5)规范脚本存放的目录
(6)不要在屏幕输出,可以输出到指定日志文件中
(7)定时任务最好都用脚本。cron中直接用命令,则命令中的%要转义,否则报错,但调用脚本则没有这个问题。

超过2行的命令执行,最好写成脚本,在定时任务是执行脚本。

不规范写法:

* * * * * sleep 1;echo "abc" >>/wddg/test.log

规范写法:

vi /wddg/test.sh

sleep 1

echo "abc" >>/wddg/test.log

* * * * * /bin/sh /wddg/test.sh >/dev/null 2>&1

(8)配置定时任务要规范操作

a、首先在命令行操作,成功后直接复制命令到脚本中,防止敲错。

b、然后,在命令行用定时任务中脚本的写法测试脚本正常后,再通过复制方式将脚本路径写入cron中。

c、最后,在测试环境中测试,通过后才在正式环境中规范部署。

(9)命令和脚本要用全路径

/bin/sh /wddg/test.sh

(10)使用tar等打包命令时,最好是切换到要打包目录的上一级目录再执行打包命令。不要从根目录打起。

六、生产场景工作中调试定时任务的方法

1、调试时,把任务执行频率调快一点,看能否执行,没有问题了,在改成需要的任务执行时间。
2、调整系统时间来调试任务(不能用于生产环境)。

示例:周三的凌晨2:00执行,这时可以把测试环境时间调整为周三的凌晨1:55分(不要太近,至少5分钟时差)。

3、通过脚本日志输出调试定时任务。

可要脚本里输出日志,也可以输出到日志文件

4、注意一些任务命令带来的问题

已经有重定向或追加符号的,不加>/dev/null 2>&1,

5、注意环境变量导致的定时任务故障

一般情况下,定时任务只能少数系统环境变量,所以定时任务在调用环境变量时, 应在脚本中先加载系统环境变量

文件或先定义环境变量。

6、通过crond定时任务服务日志调试定时任务。

tail –f /var/log/cron*

7、其它稀奇大古怪的问题调试方法

如:直接命令行执行无问题,但放到定时任务就不行。此类问题主要是多看日志。