Linux计划任务 定时任务 Crond 配置详解 crond计划任务调试 sh

Stella981
• 阅读 1314

一、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
                                        11:22:46 AM
+%F 表示 年 月 日 如:[root@
]# date +%F
                         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 

Linux计划任务 定时任务 Crond 配置详解 crond计划任务调试  sh **

七:特别注意:

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

九.     计划任务工作流程图:

**

Linux计划任务 定时任务 Crond 配置详解 crond计划任务调试  sh

题外话: rm删除的注意

**

运维人员如何最大限度避免误删除文件(20160627更新)

**

**

http://oldboy.blog.51cto.com/2561410/1687300  

误删除后的补救措施:

https://www.cnblogs.com/linux130/p/5764236.html


点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这