NO27 定时任务
linux定时任务的设置
为当前用户创建cron服务
1. 键入 crontab -e 编辑crontab服务文件
例如 文件内容如下:
*/2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh
保存文件并并退出
*/2 * * * * /bin/sh /home/admin/jiaoben/buy/deleteFile.sh
*/2 * * * * 通过这段字段可以设定什么时候执行脚本
/bin/sh /home/admin/jiaoben/buy/deleteFile.sh 这一字段可以设定你要执行的脚本,这里要注意一下bin/sh 是指运行 脚本的命令 后面一段时指脚本存放的路径
2. 查看该用户下的crontab服务是否创建成功, 用 crontab -l 命令
3. 启动crontab服务
一般启动服务用 /sbin/service crond start 若是根用户的cron服务可以用 sudo service crond start, 这里还是要注意 下 不同版本linux系统启动的服务的命令也不同 ,像我的虚拟机里只需用 sudo service cron restart 即可,若是在根用下直接键入service cron start就能启动服务
4. 查看服务是否已经运行用 ps -ax | grep cron
5. crontab命令
cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除没个用户的cron服务
crontab -e //编辑某个用户的cron服务
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r
在编辑cron服务时,编辑的内容有一些格式和约定,输入:crontab -u root -e
进入vi编辑模式,编辑的内容一定要符合下面的格式:*/1 * * * * ls >> /tmp/ls.txt
任务调度的crond常驻命令
crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此
任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工
作便会自动执行该工作。
6. crontab命令选项:
-u指定一个用户
-l列出某个用户的任务计划
-r删除某个用户的任务
-e编辑某个用户的任务
7. cron文件语法:
分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command (取值范围,0表示周日一般一行对应一个任务)
记住几个特殊符号的含义:
“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字
8. 任务调度设置文件的写法
可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件
具体格式如下:
Minute Hour Day Month Dayofweek command
分钟 小时 天 月 天每星期 命令
每个字段代表的含义如下:
Minute 每个小时的第几分钟执行该任务
Hour 每天的第几个小时执行该任务
Day 每月的第几天执行该任务
Month 每年的第几个月执行该任务
DayOfWeek 每周的第几天执行该任务
Command 指定要执行的程序
在这些字段里,除了“Command”是每次都必须指定的字段以外,其它字段皆为可选
字段,可视需要决定。对于不指定的字段,要用“*”来填补其位置。
举例如下:
5 * * * * ls 指定每小时的第5分钟执行一次ls命令
30 5 * * * ls 指定每天的 5:30 执行ls命令
30 7 8 * * ls 指定每月8号的7:30分执行ls命令
30 5 8 6 * ls 指定每年的6月8日5:30执行ls命令
30 6 * * 0 ls 指定每星期日的6:30执行ls命令[注:0表示星期天,1表示星期1,
以此类推,也可以用英文来表示,sun表示星期天,mon表示星期一等。]
30 3 10,20 * * ls 每月10号及20号的3:30执行ls命令[注:“,”用来连接多个不连续的时段]
25 8-11 * * * ls 每天8-11点的第25分钟执行ls命令[注:“-”用来连接连续的时段]
*/15 * * * * ls 每15分钟执行一次ls命令 [即每个小时的第0 15 30 45 60分钟执行ls命令 ]
30 6 */10 * * ls 每个月中,每隔10天6:30执行一次ls命令[即每月的1、11、21、31日是的6:30执行一次ls 命令。 ]
每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件
50 7 * * * root run-parts /etc/cron.daily [ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]
9. 新增调度任务
新增调度任务可用两种方法:
1)、在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)、直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务。
10. 查看调度任务
crontab -l //列出当前的所有调度任务
crontab -l -u jp //列出用户jp的所有调度任务
11. 删除任务调度工作
crontab -r //删除所有任务调度工作
12. 任务调度执行结果的转向
例1:每天5:30执行ls命令,并把结果输出到/jp/test文件中
30 5 * * * ls >/jp/test 2>&1
注:2>&1 表示执行结果及错误信息。
编辑/etc/crontab 文件配置cron
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次 /etc/crontab,因此我们配置这个文件也能运用cron服务做一些事情。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式是:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个帐号
HOME=/ //使用者运行的路径,这里是根目录
# run-parts
01 * * * * 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”这个参数了,如果去掉这个参数的话,后面就可以写要运行的某个脚本名,而不是文件夹名了
例如:
1) 在命令行输入: crontab -e 然后添加相应的任务,wq存盘退出。
2)直接编辑/etc/crontab 文件,即vi /etc/crontab,添加相应的任务
11 2 21 10 * rm -rf /mnt/fb
linux定时任务crond那些事!
来自老男孩教育的运维班面授课程内容,17期依良同学作业整理而得!
1.定时任务crond介绍
1.1 crond是什么
crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件。
特殊需求:(秒级别)crond服务就无法搞定了,一般工作中写脚本守护进程执行。
1.2 为什么要使用crond定时任务
linux系统的定时任务crond,相当于我们平时生活中的闹钟的功能。可以满足周期性执行任务的需求。
1.3 不同系统的定时任务和种类
1.3.1 windows 7 系统的定时任务
开始→所有程序→附件→系统工具→选择任务计划程序
1.3.2 linux系统的定时任务
linux系统中定时任务调度的工作可以分为以下两个情况:
① linux系统自身定期执行的任务工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理系统缓存等。
centos5.X例:
[root@CentOS5 log]# ll messages*
-rw------- 1 root root 372258 Mar 14 20:48 messages
-rw------- 1 root root 349535 Nov 11 18:13 messages.1
提示:centos 6.4日志轮询结尾是按时间了。
centos6.X例:
[root@CentOS6 log]# ll messages*
-rw------- 1 root root 1591 3月 25 21:57 messages
-rw------- 1 root root 78304 3月 3 20:40 messages-20140303
-rw------- 1 root root 78050 3月 8 19:42 messages-20140311
-rw------- 1 root root 745 3月 18 00:46 messages-20140318
-rw------- 1 root root 77232 3月 22 21:20 messages-20140325
② 用户执行的任务工作:某个用户或系统管理员定期要做的任务工作,例如每隔5分钟和互联网上时间服务器进行时间同步,每天晚上0点备份站点数据及数据库数据,一般这些工作需要由每个用户自行设置才行。
例:
[root@CentOS6 log]# crontab -l
#time sync by lee at 2014-1-14
*/5 * * * * /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1
2.定时任务crond使用说明
[root@CentOS6 log]# crontab --help
crontab:无效选项 -- -
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)
2.1 指令说明
通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位是分钟,小时,日,月,周及以上的任意组合(注意:日和周不要组合)
2.2 使用者权限及定时任务文件
文件 |
说明 |
/etc/cron.deny |
该文件中所列用户不允许使用crontab命令。 |
/etc/cron.allow |
该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny |
/var/spool/cron |
所有用户crontab配置文件默认都存放在此目录,文件名以用户名命名。 |
2.3 指令选项说明表
参数 |
含义 |
指定示例 |
-l(字母) |
查看crontab文件内容 |
crontab -l |
-e |
编辑crontab文件内容 |
crontab -e |
-i |
删除crontab文件内容,删除前会提示确认 |
crontab -ri |
-r |
删除crontab文件内容 |
crontab -r |
-u user |
指定使用的用户执行任务 |
crontab -u lee -l |
提示:crontab{-l |-e}实际上就是在操作/var/spool/cron/当前用户这样的文件。 |
注:
crontab -e |
/var/spool/cron/root |
前者会检查语法,而后者不会。 |
visudo |
/etc/sudoers |
前者会检查语法,而后者不会。 |
2.4指令的使用格式
默认情况下,当用户建立定时任务规则后,该规则记录对应的配置文件会存在于/var/spool/cron中,其crontab配置文件对应的文件名与登录的用户名一致。如:root用户的定时任务配置文件为/var/spool/cron/root。
crontab用户的定时任务一般分为6段(空格分隔,系统的定时任务则/etc/crontab分为7段),其中前五段位时间设定段,第六段为所要执行的命令或脚本任务段。
2.4.1 crontab基本格式
* * * * * cmd
提示:
① cmd为要执行的命令或脚本,例如/bin/sh /server/scripts/lee.sh.
② 每个段之间必须要有空格。
2.4.2 crontab语法格式中时间段的含义表
段 |
含义 |
取值范围 |
第一段 |
代表分钟 |
00-59 |
第二段 |
代表小时 |
00-23 |
第三段 |
代表日期 |
01-31 |
第四段 |
代表月份 |
01-12 |
第五段 |
代表星期 |
0-7(0和7都代表星期日) |
2.4.3 crontab语法格式中特殊符号的含义表
特殊符号 |
含义 |
* |
*号表示任意时间都,就是“每”的意思,举例:如00 01 * * * cmd表示每月每周每日的凌晨1点执行cmd任务。 |
- |
减号,表示分隔符,表示一个时间范围段,如17-19点,每小时的00分执行任务。00 17-19 * * * cmd。就是17,18,19点整点分别执行的意思。 |
, |
逗号,表示分隔时间段的意思。30 17,18,19 * * * cmd 表示每天17,18,19点的半点执行cmd。也可以和“-”结合使用,如: 30 3-5,17-19 * * * cmd。 |
/n |
n代表数字,即”每隔n单位时间”,例如:每10分钟执行一次任务可以写 */10 * * * * cmd,其中 */10,*的范围是0-59,也可以写成0-59/10。 |
3.书写crond定时任务7个基本要领
3.1 为定时任务规则加必要的注释
加了注释,就知道定时任务运行的是什么作业,以防以后作业混乱。这是个好习惯和规范。
[root@angelT ~]# crontab -l
#time sync by lee at 2014-1-14
*/5 * * * * /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1
3.2 定时任务命令或程序最好写到脚本里执行
[root@angelT ~]# crontab -l
#backup www to /backup
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.3定时任务执行的脚本要规范路径,如:/server/scripts
[root@angelT ~]# crontab -l
#backup www to /backup
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.4执行shell脚本任务时前加/bin/sh
执行定时任务时,如果是执行脚本,尽量在脚本前面带上/bin/sh命名,否则有可能因为忘了为脚本设定执行权限,从而无法完成任务。
[root@angelT ~]# crontab -l
#backup www to /backup
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.5 定时任务结尾加 >/dev/null 2>&1
[root@angelT ~]# crontab -l
#backup www to /backup
00 00 * * * /bin/sh /server/scripts/www_bak.sh >/dev/null 2>&1
3.5.1 有关/dev/null的说明
/dev/null为特殊的字符设备文件,表示黑洞设备或空设备。
[root@angelT ~]# ll /dev/null
crw-rw-rw- 1 root root 1, 3 3月 26 01:10 /dev/null
3.5.2 有关重定向的说明
>或1> 输出重定向:把前面输出的东西输入到后边的文件中,会删除文件原有内容。
>>或1>>追加重定向:把前面输出的东西追加到后边的文件中,不会删除文件原有内容。
<或<0 输入重定向:输入重定向用于改变命令的输入,指定输入内容,后跟文件名。
<<或<<0输入重定向:后跟字符串,用来表示“输入结束”,也可用ctrl+d来结束输入。
2> 错误重定向:把错误信息输入到后边的文件中,会删除文件原有内容。
2>> 错误追加重定向:把错误信息追加到后边的文件中,不会删除文件原有内容。
标准输入(stdin):代码为0,使用<或<<。
标准输出(stdout):代码为1,使用>或>>。正常的输出。
标准错误输出(sederr):代码为2,使用2>或2>>。
特殊:
2>&1就是把标准错误重定向到标准输出(>&)。
>/dev/null 2>&1 等价于 1>/dev/null 2>/dev/null
3.5.3 >/dev/null 2>&1的作用
如果定时任务规范结尾不加 >/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常(var/spool/clientmqueue邮件临时队列目录,垃圾文件存放于此,如果是centos 6.4系统,默认不装sendmail服务,所以不会有这个目录。)
3.6 在指定用户下执行相关定时任务
这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile,最好在程序脚本中将用到的环境变量重新export下。
3.7生产任务程序不要随意打印输出信息
在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果确实需要输出日志,可定向到日志文件里,避免产生系统垃圾。
配置定时任务规范操作过程
①首先要在命令行操作成功,然后复制成功的命令到脚本里,在各个细小环境减少出错的机会。
②然后测试小本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。
③先在测试环境下测试,然后正式环境规范部署。
4.生产场景如何调试crond定时任务
规范的公司开发和运维人员操作流程:个人的开发配置环境-->办公室的测试环境-->idc机房的测试环境-->idc机房的正式环境。
4.1 增加执行频率调试任务
在调试时,把任务执行频率调快一点,看能不能正常执行,如果正常,那就没问题了,再改成需要的任务的执行时间。
注意:有些任务时不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务要在测试机上测试好,然后正式线上出问题的机会就少了。
4.2调整系统时间调试任务
用正确的执行任务的时间,设置完成后,可以修改下系统当前时间,改成任务执行时间的前几分钟来测试(或者重启定时任务服务)
4.3通过日志输出调试定时任务
在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容的结果,看是否正确执行。
4.4注意一些任务命令带来的问题
注意: * * * * * echo “==”>>/tmp/lee.log >/dev/null 2>&1 这里隐藏的无法正确执行的任务配置,原因是前面多了>>,或者去掉结尾的 >/dev/null 2>&1。
4.5 注意环境变量导致的定时任务故障
例如:在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。
4.6通过定时任务日志调试定时任务
[root@angelT ~]# tail -f /var/log/cron
Mar 26 15:55:01 angelT CROND[3415]: (ida) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Mar 26 15:55:01 angelT CROND[3416]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Mar 26 16:00:01 angelT CROND[3422]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Mar 26 16:00:01 angelT CROND[3423]: (root) CMD (/usr/lib64/sa/sa1 1 1)
linux定时任务crond export变量问题群友案例
来自网友兄弟 北京@Grady(254553457) 的总结。
1)我写了一个重启resin的脚本,由于业务原因,需要定时在某一个时间重启下resin服务器,于是就在
crontab里配置了如下内容:
50 17 * * 1-5 root /usr/local/bin/resin_restart.sh
其中,resin_restart.sh内容如下:
#!/bin/sh
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
2)有问题的时刻到来了,服务器虽然定时起来了,但是却报了如下错误:
Resin can't load com.sun.tools.javac.Main. Usually this means that the JDK tools.jar is missing from the classpath,
possibly because of using a JRE instead of the JDK.
You can either add tools.jar to the classpath or change the compiler to an external one with <java compiler='javac'/> or jikes.
但是,明明已经在profile里配置了环境变量,为啥还找不到呢。折腾了需求没有搞定。
3)后来在QQ交流群114580181,找到了热心下老男孩老师,并请教,得到的回答是:
由于export变量问题导致:具体为,crontab执行shell时只能识别为数不多的系统环境变量,
普通环境变量一般是无法识别的,如果在编写的脚本中需要使用变量,最好使用export重新声明下该变量,
以确保脚本正确执行。以后作为一个开发基本规范写上。
------------------------
4)然后我在resin重启脚本里重新定义了下环境变量,脚本如下:
#!/bin/sh
#下面就是环境变量定义
JAVA_HOME="/opt/jdk1.6.0_18"
CLASSPATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
PATH=$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:/opt/nginx-0.7.61/sbin:/opt/jdk1.6.0_18/bin:/opt/resin-3.0.25/bin:$PATH
export JAVA_HOME PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC CLASSPATH
/usr/local/bin/xxresin_stop.sh
/usr/local/bin/xxresin_start.sh
5)经过测试,定时任务此时顺利重启,在这里非常感谢老男孩老师给与的支持。
若面试问任务脚本感觉啥都正确但就是没有执行,什么原因?
回答:
这个问题我遇到过,写time crond脚本遇到过,后面把变量重新变量就好了。
1、java是否有权限
2、定义java脚本,环境变量要重新定义。
3、命令要写全路径
Linux Crond定时任务练习题
Crond是系统中用来定期执行命令或指定程序任务的一种服务或软件。 严格的说,linux系统下的定时任务软件不少,例如:at、crontab、anacron,其中crontab这个命令是在实际工作中常用于周期性执行任务。例如:每五分钟做一次服务器时间同步。要执行crontab这个命令,也需要启动一个服务crond。那么,我们对crontab练习操作一下喽。
一、根据命令说出文字含义:
1)30 3,12 * /bin/sh /scripts/oldboy.sh
本实例中,第一列为30,表示 30 分钟;第二列为3点及12点,此定时任务的意思是每天凌晨3点和总务12 点的半点时刻(即每天3:30 和12:30)执行/scripts/oldboy.sh 脚本
2)30 */6 * * * /bin/sh /scripts/oldboy.sh
本实例中,第一列为30,表示30 分钟,第二列为*/6代表每6个小时,此定时任务的意思是每隔6个小时的半点时刻(即每天6:30、12:30、18:30、24:30)执行/scripts/oldboy.sh 脚本
3)30 8-18/2 * * * /bin/sh /scripts/oldboy.sh
本实例中,第一列为30,表示30 分钟,第二列为8-18/2 代表上午8 点到下午18 点之间每隔2
小时,此定时任务的意思是每天上午8 点到下午18 点之间每隔2 个小时执行/scripts/oldboy.sh 脚本
4)30 21 * * * /application/apache/bin/apachectl graceful
表示每晚21:30 重启Apache
5)45 4 1,10,22 * * /application/apache/bin/apachectl graceful
表示每月1、10、22 日的凌晨4:45 分重启Apache
6)10 1 * * 6,0 /application/apache/bin/apachectl graceful
表示每周六、周日的凌晨1:10 分重启Apache
7)0,30 18-23 * * * /application/apache/bin/apachectl graceful
表示每天18:00 到23:00 之间每隔30 分钟重启Apache
8)* 23,00-07/1* * * /application/apache/bin/apachectl graceful
表示23 点到次日07 点之间每隔一小时每分钟都重启Apache
9)00 11 * 4 1-3 /application/apache/bin/apachectl graceful
表示4 月的每周一到周三的上午11 点整重启Apache
二、根据文字描述写出定时规则:
1)5 月5 日上午9:00 去老男孩培训上课。规则为:
#00 09 05 05 * 去老男孩培训上课
2)每周日上午9:30 区老男孩教育培训。规则为:
#30 09 * * 0 去老男孩教育培训
Crond服务是运行的程序,可以通过crontab在固定的间隔时间执行执行的系统指令或script脚本。时间间隔的单位可以是分钟、小时、日、月、周以及任意以上组合(日和周不要组合),适用于实现周期性的日志分析或数据备份等企业运维场景工作。