一、Crond 是什么?(概述)
crontab 是一款linux系统中的定时任务软件用于实现无人值守或后台定期执行及循环执行任务的脚本程序,在企业中使用的非常广泛.
现在开始学习linux计划任务程序吧。
crontab的优势: 可以实现24小时或定期执行任务,非常高效实用,几乎是每个企业都会用到的服务,同时
crond服务是运行的程序,而crontab命令是用户用来设置定时规则的命令。(crontab -e 新建一个计划任务)
#注: http://blog.csdn.net/a347911/article/details/72875763 ##crontab实现分布式定时任务项目方案(博文)
#注: http://blog.51cto.com/hongtengfei/1683153 #Crond定时任务详细分析 (博文)
#注: http://blog.51cto.com/oldboy/1410555 #定时任务那些事
#http://blog.sina.com.cn/s/blog\_506ed9e6010106kj.html 命令passwd报错因inode节点处理记录 修改密码报错 inode节点满导致密码无法修改
$###### 定时任务中的 % 需要转义,而脚本中的 % 则无需转义 ##########$
脚本命令最好要全路径 或增加 命令解释器,下面是命令解释器增加方法
#----->$$最好在脚本中重新定义如:
#!/bin/bash,/bin/sh
export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
------------>>>脚本内容<<----------------------------------------------------------
JAVA程序无法执行,JAVA程序脚本环境变量定义:
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
二、同类型软件说明
crontab:crontab设置的任务将会一直循环的执行下去(适用于7*24小时不关机的服务)
anacron:anacron与anacrontab(秒级任务-适用于需要关闭的服务器,常用在以天单位或者开机之后执行任务)
at:at可以处理和执行一次性任务调度的命令(Windows系统中的,不深究) #相关资料:http://blog.csdn.net/java\_student09/article/details/52226144
三、Crontab参数
-u 指定用户下的计划任务,但会让任务更分散不好管理,优点更安全。 crontab -u user file
-i 删除确认 crontab -ri
-l 列表,列出,查看内容 相当于 cat /var/spool/cron/root \\root为用户名。 常用 crontab -l
-e edit 编辑创建crontab文件内容 相当于vi /var/spool/cron/root \\root为用户名 常用 crontab -e
-s 与selinux 相关
-r 删除crontab文件内容 remove (不常用)
四:****Crontab特殊符号
特殊符号:
* 在crond中 * 代表任意时间 每 的意思 如: 00 23 * * * cmd 表示每月每周每日23:00 均执行 cmd任务
注意: 每个事件位上的* 表示 每 ,如果位上是 * 就是该位上的取值范围, 例如: 小时上的 * 等于 00-23
经验技巧: 定时任务规则如果到小时,口述时就是最多每天,分位上的 * 等于 0-59 表示每分。
- 减号 表示分隔符,表示一个时间范围,时间段,如 17-19点,就是 每天的 17 18 19 点的 0分 执行任务,例如:
00 17-19 * * * cmd 就是指 17 18 19点分别执行的意思。
, 逗号,表示分割时段的意思。 30 17,18,19 * * * /bin/sh/scripts/oldboy.sh 表示 每天 17 18 19 点半 执行 /scripts/oldboy.sh 脚本,也可以和 " - " 结合使用
如: 30 3-5,17-19 * * * /bin/sh /scripts/oldboy.sh 表示每天的 3点 4点 5点 17点 18点 19 点 分 别执行 /bin/sh /scrip/oldbou.sh 脚本
/n n代表数字,即‘每隔N单位时间’ , 例如: 每隔10分钟执行一次任务,可以写成 */10 * * * * cmd 其中 */10,*的范围是 0-59,因此也可以携程 0-59/10 每隔10分钟执行一次任务。
五:crontab 任务数列说明
系统默认定时任务为7段 用户的定时任务为6段:
# .---------------- 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
min hour day month dayofweek
分 时 日 月 周
解释:
第一个 * 分 0-59 */10 每10分钟一次 也可以写成 0-59/10 10分钟一次
第二个 * 小时 0-23
第三个 * 天 1-31
第四个 * 月 1-12
第五个 * 周 0-6 或者 0-7 0和7都代表周日
第六个 * 执行shell命令解释器 如:/bin/sh , /
第七个 * 执行的脚本名
口诀 : 分 时 日 月 周 shell解释器 脚本名或脚本程序地址
# 如: # time sync by oldboy #---->>注释
0 */2 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null2>&1 & #--->>计划任务动作
获取时间的表示:
+%X 表示 小时,分钟,秒 ,上午/下午 如:[root@]# date +%X]# date +%F
11:22:46 AM
+%F 表示 年 月 日 如:[root@
2018-02-10
获取年月日时 : [root@~]# date +%F" "%X
2018-02-10 11:22:27 AM
六:定时任务的规范
**俗话说没有规矩不成方圆,定时任务是linux系统中非常重要的一个组件,几乎每个企业都会用到,所以书写规范是非常重要的
以下为规范书写的几条事项,请在以后工作中严格按照如下规范来执行定时任务
1.注释 -->>注释的作用是用于让它人清楚你所定义的定时任务的目的
2.命令放入脚本 -->>这一步很重要,也必须养成习惯,使用定时任务来调用 shll 脚本,如要修改可以不动crontab文件直接修改脚本文件
3.命令的无误测试 -->>无误测试也是做定时任务比较重要的环节,我们可以用 sh -x 来调试脚本
调试过程:
[root@oldboy /]# sh -x backup_new.sh
+ cd / #bash添加 /bin/bash,/bin/sh 才好执行 cd命令
++ date +%F
+ tar zcf backup/back_2017-10-10.tar.gz etc/rc.local var/spool/cron etc/hosts
+ xargs rm -rf
+ find backup -type f -mtime +3 -name '*.tar.gz'
!!!#---->以上测试无错 即可进行下一步操作。 + 代表成功
4.打包类定时任务,先进入上级目录再进行打包操作 -->> 在定时任务中如有打包操作,最好是去上一级目录来进行,如果直接在当前目录打包会产生一些不必要的麻烦
5.打包链接文件 需要在tar 后加 h 参数 打包符号链接的文件,也就是打包快捷方式,不打包解压后是红色
6.规范脚本目录 -->>脚本分类很重要,定时任务中需要调用的脚本,请定义脚本专用目录,如:/server/scripts,通过目录名来区分,在写定时任务时添加脚本目录地址
7.取消无用的输出 -->>脚本执行的过程中有一些垃圾输出或无用输出需要避免,所以一般没有必要的垃圾输出请用 >/dev/null 2>&1 &&\ tar程序请不要加 v 输出
8.给脚本添加执行权限 -->>脚本执行需要x权限或管理员权限,请在完成脚本程序后 通过 chmod +x /shell/1.sh 来增加可执行权限
9.删除某条任务请先备份crontab文件或通过sed -i 来删除某条任务 -->>运维是一项高风险工作,任何影响到系统运行的程序或脚本在更改时一定要注意先备份,可设置备份文件夹,删除某条目前先将源文件备份要专用的备份文件夹中 --->> cp /var/spool/cron/root /cron_bak/root_cron$(date +\%F_\%X)
10.引导执行下一行 -->> 在crond文件中,如果后续还有别的程序要执行,请一定加上 &&\ 代表还有后续脚本需要执行
11.脚本文件请以.sh 作为扩展名,并添加 x 可执行权限
12.时间变量问题用反斜线\% 转义,最好用脚本。 如:tar zcvf /tmp/services_$(date +\%F-\%H":"\%M).tar.gz 以免报错
13.查看定时任务日志: tail /var/log/cron
14.定时任务需要执行,一定要开启定时任务的服务 #-->> service crond status 查看是否正在运行中
15. 定时任务执行的shell 请一定要指定命令解释器: #!/bin/sh,/bin/bash
七:特别注意:
1.系统还将变量导致定时任务执行问题(java)
http://oldboy.blog.51cto.com/2561410/1541515
时间命令 最好环境变量中添加 /bin/date ,否则报错
2.脚本权限问题加 /bin/sh 或者查看是否有添加 x 权限
3.时间变量导致的问题比较多,请一定使用 $(date +\%F_\%X) 来操作
# 定时任务中的 % 需要转义,而脚本中的 % 则无需转义
4.脚本中的命令尽量使用全路径
5.打包一个目录时 请跳转到上级目录再进行打包,不要进入需要打包的目录中操作
6.切记 脚本的调试非常重要 sh -x
7.定时任务执行的shell 请一定要指定命令解释器: #!/bin/sh
8.如有java程序运行必要 请在脚本中添加系统变量
#!/bin/bash
export JAVA_HOME=/application/jdk1.6
export PATH=$JAVA_HOME/bin:$PATH
export SH_HOME=/application/resin/webapps/ROOT/
export LIB=$SH_HOME/WEB-INF/lib
八. crond案例示范(定时任务案例题):
第一题: 请写出5月5号上午9点 上课的规则?
00 09 05 05 * /bin/sh /scripts/shangke.sh
第二题: 请写出每周日上午9:30 去老男孩培训规则
30 09 * * */7 /bin/sh /scripts/shangke.sh
第三题: 请写出 每分钟向 /services/log/oldboy.log 文件中写入一次 oldboy 的脚本
*/1 * * * * /bin/sh /scripts/shangke.sh
第四题: 请写出 每隔两个小时 将/etc/services/ 文件夹打包到 /tmp 目录下且生成每次打包的时间(精确到分)
00 */2 * * * /bin/sh /bin/tar zcf /etc/services_$(date +%F"-" +%H).tar etc/services
第五题: 请写出 每周六周日上午9点和下午14点来老男孩培训,要求打印出打包时间 按天 打包
00 09,14 * * 6,7 /bin/sh /bin/tar zcf /etc/services_$(date +\%F).tar etc/services
第六题: 请写出 每天晚上 00:30 打包站点目录 /etc/rc.local /etc/hosts /var/spool/cron 到 /backup中 且 按当前时间打包(精确到年月日时)
30 00 * * * /bin/sh tar zcf /backup/$date(+%F"_"+%X).zip etc/rcl.local etc/hosts var/spool/crnod
1.创建sh脚本文件
touch /services/scripts/bak.sh
vi /services/scripts/bak.sh
写入:
#!/bin/sh,/bin/bash ##\\\这里最好加两个解释器 一个是/bin/bash 一个/bin/sh
cd / &&\
tar zcf /backup/tar_$(date +\%F).tar.gz etc/rc.local etc/hosts var/spool/crond
保存以上内容为 bak.sh
2.调试脚本sh -x:
[root@~]# sh -x /services/scripts/bak1.sh
+ cd /
++ date +%F
+ /bin/tar zcf /backup/tar_2018-02-10.tar etc/rc.local etc/hosts
! 如果过程中没有报错即 成功
3.验证
调试结果:
[root@~]# sh -x /services/scripts/bak1.sh
+ cd /
++ date +%F
+ /bin/tar zcf /backup/tar_2018-02-10.tar etc/rc.local etc/hosts
九. 计划任务工作流程图:
**
题外话: rm删除的注意
**
运维人员如何最大限度避免误删除文件(20160627更新)
**
**
http://oldboy.blog.51cto.com/2561410/1687300
误删除后的补救措施:
https://www.cnblogs.com/linux130/p/5764236.html