linux的定时任务

来源:互联网 发布:软件开发需要学什么 编辑:程序博客网 时间:2024/06/05 01:19

提外话:今天运维部的人叫我把zabbix报警频率次数多的问题上报上去,主要是一些磁盘清理任务,还有些cpu和nginx的问题,统计了下。把问题丢过去,他们将脚本加入到定时任务中。这样我就又有时间发育了。身为一名菜鸡的觉悟是不是有点高。想想中国共产党没来招我,真是埋没人才。

开始吧。这里继续我的copy别人的。定时任务这东西,两三年前学的,忘得一干二净,还好,还知道有个叫定时任务的服务。
############2017-9-22补充###########
模糊点:比方说我加了个定时任务,那么如:

*/3 * * * *  /usr/bin/python test.py

那么一加入,他就执行吗。
应该是这样的,通过测试:

比方说现在 12:00,那么,你把它看做,11:60.60能被3整除吗,        能,则执行如果加入的时间是12:011能被整除吗:        不能,所以要等到12:03执行。

转载地址:
http://www.cnblogs.com/intval/p/5763929.html
1、crond简介

crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

Linux下的任务调度分为两类,系统任务调度和用户任务调度。

系统任务调度

:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

[root@VM_157_218_centos ~]# cat /etc/crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root                    #就是send mail to user-nameHOME=/# 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)# |  |  |  |  |# *  *  *  *  * user-name command to be executed

需要注意的一点是user-name 不能少,就是你是root就写root,执行的用户名不能少,否则执行不了。

下面的给个示范:

[root@VM_157_218_centos mkd]# cat /etc/crontab SHELL=/bin/bashPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=rootHOME=/# 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 be executed*/1 * * * *   root  date "+%Y-%m-%d %H:%M:%S" >>/root/mkd/time.log# run-parts01 * * * * root run-parts /etc/cron.hourly  #每小时执行/etc/cron.hourly内的脚本02 4 * * * root run-parts /etc/cron.daily  #每天执行/etc/cron.daily内的脚本22 4 * * 0 root run-parts /etc/cron.weekly #每星期执行/etc/cron.weekly内的脚本42 4 1 * * root run-parts /etc/cron.monthly #每月去执行/etc/cron.monthly内的脚本大家注意"run-parts"这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了。

但是问题来了过了好久都没有执行, service crond restart 没用,看看日志去

[root@VM_157_218_centos mkd]# cat /var/log/cron Jul 11 14:40:01 localhost CROND[12723]: (root) CMD ( date "+)Jul 11 14:41:01 localhost CROND[12814]: (root) CMD ( date "+)#这里我删除了部分其他无关的日志。#应该是这句话问题了 date "+%Y-%m-%d %H:%M:%S"[root@VM_157_218_centos mkd]# date "+%Y-%m-%d %H:%M:%S"2017-07-11 14:46:37#放到命令行下是没问题的。那么在文件中的格式有要求吗?#将""给为' '后试试,改后,重新加载。[root@VM_157_218_centos mkd]# tail -6 /var/log/cronJul 11 14:52:01 localhost CROND[13801]: (root) CMD ( 'date "+)Jul 11 14:53:01 localhost crond[12376]: (*system*) RELOAD (/etc/crontab)Jul 11 14:53:01 localhost CROND[13897]: (root) CMD ( date '+)#还是有问题。是不是绝对路径问题,改成绝对路径后发现也不是该原因。#Jul 11 14:56:01 localhost CROND[14170]: (root) CMD ( /bin/date '+)

再次修改下

将里面的改为:*/1 * * * * /bin/date#看下日志/var/log/cron[root@VM_157_218_centos mkd]# tail -10 /var/log/cronJul 11 15:09:01 localhost CROND[15420]: (root) CMD ( /bin/date )#这种是可以的语法,和错误的没什么区别吧。也不会说显示error什么的。[root@VM_157_218_centos mkd]# tail -15 /var/spool/mail/root To: root@VM_157_218_centos.localdomainSubject: Cron <root@VM_157_218_centos>  /bin/date Content-Type: text/plain; charset=ANSI_X3.4-1968Auto-Submitted: auto-generatedX-Cron-Env: <LANG=C>X-Cron-Env: <SHELL=/bin/bash>X-Cron-Env: <PATH=/sbin:/bin:/usr/sbin:/usr/bin>X-Cron-Env: <HOME=/>X-Cron-Env: <LOGNAME=root>X-Cron-Env: <USER=root>Message-Id: <20170711071002.169E25E1BD@VM_157_218_centos.localdomain>Date: Tue, 11 Jul 2017 15:10:02 +0800 (CST)#在没有打印在文中的send user mail的信息中有这样的两行:/bin/bash: -c: line 0: unexpected EOF while looking for matching `''/bin/bash: -c: line 1: syntax error: unexpected end of file#这是之前带引号报的错。#而改后,重新加载日志后如下[root@VM_157_218_centos mkd]# cat zg.log Tue Jul 11 15:13:01 CST 2017Tue Jul 11 15:14:01 CST 2017Tue Jul 11 15:15:01 CST 2017Tue Jul 11 15:16:02 CST 2017Tue Jul 11 15:17:01 CST 2017#所以比较复杂的命令就写成脚本吧。

其实

可以 看的是只能指定到分,那我想要做到秒级的呢?
第一种:直接写脚本,不管什么语言,肯定可以实现秒级的。
第二种:配合脚本实现秒级。
等下写个脚本就知道怎么回事了。

这里写图片描述
盗的别人的图,可以去原文自己看看的。
在以上各个字段中,还可以使用以下特殊字符:

星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。

逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”

中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”

正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

crontab -e 编辑示例:

30 2 * * * /data/app/scripts/hotbackup/hot_database_backup.sh10 8,12,16 * * * /data/app/scripts/monitor/check_ind_unusable.sh10 8,12,16 * * * /data/app/scripts/monitor/check_maxfilesize.sh10 8,12,16 * * * /data/app/scripts/monitor/check_objectsize.sh时间填写示例:43 21 * * * 21:43 执行15 05 * * *    05:15 执行 每天0 17 * * * 17:00 执行0 17 * * 1 每周一的 17:00 执行0,10 17 * * 0,2,3 每周日,周二,周三的 17:00和 17:10 执行0-10 17 1 * * 毎月1日从 17:00到7:10 毎隔1分钟 执行0 0 1,15 * 1 毎月1日和 15日和 一日的 0:00 执行42 4 1 * *     毎月1日的 4:42分 执行0 21 * * 1-6   周一到周六 21:00 执行0,10,20,30,40,50 * * * * 每隔10分 执行*/10 * * * *        每隔10分 执行* 1 * * *         从1:0到1:59 每隔1分钟 执行0 1 * * *         1:00 执行0 */1 * * *        毎时0分 每隔1小时 执行0 * * * *         毎时0分 每隔1小时 执行2 8-20/3 * * *      8:02,11:02,14:02,17:02,20:02 执行30 5 1,15 * *       1日 和 15日的 5:30 执行

用户任务调度

:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

使用者权限文件:
文件:
/etc/cron.deny
说明:
该文件中所列用户不允许使用crontab命令

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

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

crontab命令详解

1.命令格式:

crontab [-u user] file

crontab [-u user] [ -e | -l | -r ]

2.命令功能:

通过crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script脚本。时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合。这个命令非常设合周期性的日志分析或数据备份等工作。

3.命令参数:

-u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。

file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。

-e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。

-l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab文件内容。

-r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。

-i:在删除用户的crontab文件时给确认提示。

文件:

以CentOS为例,其真实的位置在:/var/spool/cron下面,有执行定时任务的用户将会有以该用户命名的一个文档,vim该文档与用命令crontab -l看到的一样。
crontab命令用于安装、删除或者列出用于驱动cron后台进程的表格。也就是说,用户把需要执行的命令序列放到crontab文件中以获得执行。每个用户都可以有自己的crontab文件。下面就来看看如何创建一个crontab文件。

在/var/spool/cron下的crontab文件不可以直接创建或者直接修改。crontab文件是通过crontab命令得到的。现在假设 有个用户名为foxy,需要创建自己的一个crontab文件。首先可以使用任何文本编辑器建立一个新文件,然后向其中写入需要运行的命令和要定期执行的 时间。

然后存盘退出。假设该文件为/tmp/test.cron。再后就是使用crontab命令来安装这个文件,使之成为该用户的crontab文件。键入:

crontab test.cron

这样一个crontab 文件就建立好了。可以转到/var/spool/cron目录下面查看,发现多了一个foxy文件。这个文件就是所需的crontab 文件。用more命令查看该文件的内容可以发现文件头有三行信息:

#DO NOT EDIT THIS FILE -edit the master and reinstall.

#(test.cron installed on Mon Feb 22 14:20:20 1999)

#(cron version –Id:crontab.cv2.131994/01/1703:20:37vivieExp

大概意思是:

#切勿编辑此文件——如果需要改变请编辑源文件然后重新安装。

#test.cron文件安装时间:14:20:20 02/22/1999

如果需要改变其中的命令内容时,还是需要重新编辑原来的文件,然后再使用crontab命令安装。

可以使用crontab命令的用户是有限制的。如果/etc/cron.allow文件存在,那么只有其中列出的用户才能使用该命令;如果该文件不存 在但cron.deny文件存在,那么只有未列在该文件中的用户才能使用crontab命令;如果两个文件都不存在,那就取决于一些参数的设置,可能是只 允许超级用户使用该命令,也可能是所有用户都可以使用该命令。

/etc/下的有些目录
/etc/cron.d 此目录下存放的是系统级任务的任务文件。
/etc/cron.daily
/etc/cron.allow
/etc/cron.deny
/etc/cron.hourly
/etc/cron.monthly
/etc/cron.weekly
/etc/crontab

/etc/anacrontab  这个文件存着系统级的任务。它主要用来运行每日的(daily),每周的(weekly),每月的(monthly)的任务。一般不在此文件安装自己的任务[root@VM_157_218_centos mkd]# cat /etc/anacrontab # /etc/anacrontab: configuration file for anacronSHELL=/bin/shPATH=/sbin:/bin:/usr/sbin:/usr/binMAILTO=root# the maximal random delay added to the base delay of the jobsRANDOM_DELAY=45# the jobs will be started during the following hours onlySTART_HOURS_RANGE=3-22#period in days   delay in minutes   job-identifier   command1   5   cron.daily      nice run-parts /etc/cron.daily7   25  cron.weekly     nice run-parts /etc/cron.weekly@monthly 45 cron.monthly        nice run-parts /etc/cron.monthly

不写了。到时候写过几天写定时任务,出问题再补。