第十三节 定时任务补充

标签(空格分隔): Linux实战教学笔记

---[更多资料点我查看][1]

1,生产环境常用Crontab专业实例

1.1书写crontab定时任务多个基本要领

1.1.1 规范定时任务两例

例1:每分钟打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。

[root@chensiqi1 ~]# mkdir -p /server/log/
[root@chensiqi1 ~]# echo "chensiqi" >>/server/log/chensiqi
[root@chensiqi1 ~]# cat /server/log/chensiqi
chensiqi
[root@chensiqi1 ~]# crontab -e
crontab: installing new crontab
[root@chensiqi1 ~]# crontab -l
##print name to file
* * * * * /bin/echo "chensiqi" >>/server/log/chensiqi
[root@chensiqi1 ~]#

解答:

方法1:

#print my name to log by chensiqi at 2017211
* * * * * /bin/echo "chensiqi" >>/server/log/chensiqi

方法2

#print my name to log by chensiqi at 2017211
*/1 * * * * /bin/echo "chensiqi" >>/server/log/chensiqi >dev/null 2>&1
提示:这是一个错误的定时任务,请同学们思考错在了哪里?

解答知识小结:

1,定时任务要加注释

2,如果已经要定向到文件中,结尾不要有>/dev/null 2>&1

3,/server/log目录必须要存在才能出结果,如没有创建这个目录。

4,定时任务中的路径一定要绝对路径

5,crond服务必须首先开启

6,查看定时任务日志tail /var/log/cron

例2:每周六,日上午9点和下午14点(执行/server/scripts/chensiqi.sh).要求:/server/scripts/chensiqi.sh脚本的功能是打印当天的日期:格式为2017-02-11可以随意。

解答:

##
00 9,14 * * 0,6 /bin/sh /server/scripts/chensiqi.sh >/dev/null 2>&1

步骤:

  • 1,创建对应的目录

    mkdir /server/scripts -p
  • 2,命令行测试

    date +%F 2017-02-11
  • 3,书写脚本

    echo 'date +%F' >/server/scripts/chensiqi.sh cat /server/scripts/chensiqi.sh
  • 4,命令行测试脚本

    /bin/sh /server/scripts/chensiqi.sh

    2017-02-11
  • 5,编辑定时任务(让他快速执行*****)

    crontab -e

    #sync time chensiqi at 20170211 */5 * * * * /usr/sbin/ntpdate ntp1.aliyun.com >>/server/log/chensiqi.log 2>&1

注意:

测试的时候最好定向到一个文件中。

  • 6,测试

    tail -f /server/log/chensiqi.log

    2017-02-11
  • 7,按照原来的要求更改定时任务的时间
#go to chensiqi trainning by chensiqi at 20170211
00 09,14 * * 0,6 /bin/sh /server/scripts/chensiqi.sh >>/server/log/chensiqi.log

技巧:

  1. 定时任务一定要尽量用脚本实现。
  2. 命令行操作成功,然后放入脚本执行(/bin/sh 脚本全路径)成功,最后在配置任务
  3. 复制操作成功的命令行脚本,再定时任务里黏贴配置。
  4. 加/bin/sh执行脚本 /bin/sh /server/script/chensiqi.sh
  5. 要把脚本的执行结果定向到空或者是一个文件中,不要什么都不加。

1.1.2 定时任务书写要领

  • 要领1:为定时任务规则加必要的注释

加必要注释:写定时任务规则时尽可能的加上注释(最好是英文注释),这是个好的习惯和规范。

例如:谁在什么时间干了什么(注释内容)什么人,什么时间,因为什么,做了什么。如果这些都标记清楚了,这样其他的运维人员可以很容易的理解任务的信息,从而提升团队的工作效率。

  • 要领2:执行shell脚本任务前加/bin/sh

执行定时任务时,如果是执行脚本,请尽量在脚本前面加上/bin/sh命令,否则有可能因为忘了为脚本设定执行权限(x),从而以为OK了,结果无法完成任务,这样就“悲剧”了

  • 要领3:定时任务命令或脚本的结尾加>/dev/null 2>&1

定时任务(一般是脚本任务)规则的结尾最好加上>/dev/null 2>&1等内容,如果需要打印日志,则可以追加到指定的日志文件里(此时不要和/dev/null同时存在),尽量不要留空。如果任务是命令的话,结尾使用“>/dev/null 2>&1”时要多测试下,要有检查手段。如:*/1 * * * * echo "==" >>/tmp/chensiqi.log>/dev/null 2>&1 任务规则就是无法执行的。

  • 要领4:定时任务命令超过2条的命令执行,最好用脚本文件

超过2条的命令执行,最好用脚本文件。下面的方法就是不规范的,不专业的。

* * * * * sleep 1;echo chensiqi >> /server/log/chensiqi.log

标准写法:

[root@chensiqi /]# cat /server/scripts/log.sh
sleep1
echo chensiqi >> /server/log/chensiqi.log

定时任务写法:

* * * * * /bin/sh /server/scripts/log.sh >dev/null 2>&1

定时任务,给定时任务看病的日志/var/log/cron
  • 要领5:在指定用户下执行相关定时任务

需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,可以登录到普通用户下(也可以直接在root下crontab -u chensiqi -e 的写法直接设置),然后设置。这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile(如生产场景中java程序的定时任务),最好在程序脚本中将用到的环境变量重新export下(下文有案例)。

  • 要领6:生产任务程序不要随意打印输出信息。

    尽量关闭取消没有用的输出(命令的执行过程)

    1,定向到文件

    2,>/dev/null 2>&1

    在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及命令输出的内容信息屏蔽掉,如果确实需要输出日志,可定向到执行日志文件里,避免产生系统垃圾。

  • 要领7:定时任务命令或程序最好写到脚本里执行

  • 要领8:定时任务执行的脚本要规范路径

例如:/server/scripts

  • 要领9:配置定时任务规范操作过程,防止出错。

1,首先要在命令行操作成功,然后复制成功的命令到脚本里,在各个细小环节减少出错的机会。

2,然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。

3,先在测试环境下测试,然后正式环境规范部署

小结:

书写定时任务的若干要领方法:

要领1:为定时任务规则加必要的注释。

要领2:执行shell脚本任务前加/bin/sh

要领3:定时任务命令或脚本结尾加>/dev/null 2>&1

要领4:定时任务命令或程序最好写到脚本里执行

要领5:在指定用户下执行相关的定时任务

要领6:生产任务程序不要随意打印输出信息

要领7:定时任务执行的脚本要规范路径(/server/scripts)

要领8:配置定时任务规范操作过程

1.1.3 在命令行输入./chensiqi.sh(/server/scripts/chensiqi.sh)与sh chensiqi.sh区别在哪?

 [root@chensiqi1 ~]# cat chensiqi.sh
#!/bin/bash echo "chensiqi"
[root@chensiqi1 ~]# ll chensiqi.sh
-rw-r--r--. 1 root root 29 Feb 10 21:44 chensiqi.sh
[root@chensiqi1 ~]# sh chensiqi.sh
chensiqi
[root@chensiqi1 ~]# ./chensiqi.sh
-bash: ./chensiqi.sh: Permission denied
[root@chensiqi1 ~]# 命令说明:
sh chensiqi.sh表示用/bin/sh这个命令来解析并启动chensiqi.sh这个脚本。而./chensiqi.sh表示利用linux的默认解释器来解析并启动这个脚本。因此,./chensiqi.sh需要linux下x的执行权限,而sh chensiqi.sh不需要。

1.1.4 定时任务不加>/dev/null 2>&1的后果

  • 如果定时任务规则结尾不加>/dev/null 2>&1等命令配置,有可能有大量输出信息,时间长了,可能由于系统未开启邮件服务而导致邮件临时目录/var/spool/clientmqueue 文件数猛增的隐患发生,大量文件会占用大量磁盘inode节点(每个文件占一个inode),以致磁盘inode满而无法写入正常数据(下文有案例)。
  • 提示:上面的>/dev/null 2>&1 写法也可以写成1>/dev/null 2>/dev/null,例:$JAVA-jar $RESIN_HOME/lib/resin.jar $ARGS stop 1>/dev/null 2>/dev/null 此写法来自resin服务默认启动脚本
  • 上述是centos5.8的情况,假如系统不安装sendmail(Centos6.4),那是不是就没有上述问题了?

企业案例::如果定时任务规则结尾不加>/dev/null 2>&1,很容易导致硬盘inode空间被占满,从而系统服务不正常。

当一个定时任务执行的时候,就会给系统发一封邮件。sendmail邮件服务,经常是关闭的,所以定时任务发送的邮件就会临时堆在/var/spool/clientmqueue/,时间长了,/var/spool/clientmqueue/文件数特别多。Centos5的时候一定会有这个问题。

Centos6呢?请往下看。

[root@chensiqi1 ~]# cat /etc/redhat-release
CentOS release 6.8 (Final)
[root@chensiqi1 ~]# crontab -l
#go to chensiqi trainning by chensiqi at 20170211
* * * * * /bin/sh /root/chensiqi.sh
[root@chensiqi1 ~]# ls /var/spool/postfix/maildrop/
D3AD0C6 DB2BAC9 E14E6D0 E5222D1
[root@chensiqi1 ~]# 命令说明:
定时任务没定向到空,postfix服务没有开启的话,那么每执行一次定时任务,/var/spool/postfix/maildrop/文件夹下就会产生一个小文件,随着时间累计,就会越来越多,导致出现问题。
如果开启了邮件服务,就会直接给root发送邮件。

解决方法:

1,删除大量小文件/var/spool/postfix/maildrop/下所有文件(ls|xargs rm -f)

2,临时开启postfix(sendmail)服务

3,vi /etc/crontab:将‘MAILTO=root’替换成‘MAILTO=“”’然后service crond restart即可。(如果还不行,crontab -e 第一行增加MAILTO=“”)

亡羊补牢:

定时任务定向到空>/dev/null 2>&1

目录名 解释
/var/spool/clientmqueue centos5.xsendmail临时邮件文件目录,有很多原因会导致这个目录碎文件很多,比如crontab定时任务命令不加>/dev/null等,并且sendmail服务没开。工作中偶尔会因为该目录文件太多,导致/var所在的分区inode数量被消耗尽,无法写入文件的情况
/var/spool/postfix/maildrop/ centos6.x postfix临时队列目录/var/spool/postfix/maildrop/默认定时任务执行时会给root发邮件,如果邮件服务不开,就会把邮件推到上述目录。当定时任务结尾不加>/dev/null 2>&1的时候,定时任务就会在上述目录存大量小文件

1.2 定时任务的系统配置文件/etc/crontab

[root@chensiqi1 ~]# 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 be executed

SHELL=/bin/bash #shell解释器

PATH=/sbin:/bin:/usr/sbin:/usr/bin #PATH环境变量

MAILTO=root #定义如果任务有输出,发给哪个用户,默认发给root用户

HOME=/ #定时任务执行命令从根目录开始

轮询的日志(日志轮询):周期性切割日志

系统的定时任务+logrotate

[root@chensiqi1 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh /usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
[root@chensiqi1 ~]ll /var/log/messages*
-rw-------. 1 root root 58049 Feb 10 23:18 /var/log/messages
-rw-------. 1 root root 1492005 Jan 2 06:51 /var/log/messages-20170102
-rw-------. 1 root root 633737 Jan 8 08:02 /var/log/messages-20170108
-rw-------. 1 root root 1594144 Feb 4 04:25 /var/log/messages-20170204
-rw-------. 1 root root 21512 Feb 6 03:41 /var/log/messages-20170206
[root@chensiqi1 ~]# ll /var/log/secure*
-rw-------. 1 root root 4810 Feb 10 22:39 /var/log/secure
-rw-------. 1 root root 64822 Jan 2 06:27 /var/log/secure-20170102
-rw-------. 1 root root 14187 Jan 8 07:22 /var/log/secure-20170108
-rw-------. 1 root root 13540 Jan 12 00:17 /var/log/secure-20170204
-rw-------. 1 root root 5723 Feb 6 02:50 /var/log/secure-20170206

1.3 企业生产场景如何调试crontab定时任务

1.3.1 增加执行任务频率调试任务(某些任务不能用于生产环境)

1,在调试时,把任务执行频率调快一点,如:每分钟,每5分钟执行一次,或者比当前时间推迟5分钟以后,看能否执行,是不是按照你想象的去执行了,如果正常没问题了,在改成需要的任务的执行时间。

强调:有些计划任务是不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务就要在测试机上测试好,然后部署到正式线上,这样正式工作出问题的机会就少了。

规范的公司开发和运维人员操作流程,个人的开发配置环境-->办公室的测试环境-->idc机房的测试环境-->idc机房的正式环境。

使用log文件调试任务

          • /bin/sh /server/scripts/del_sys_file.sh >/tmp/file.log 2>&1

1.3.2 调整系统时间调试任务(不能用于生产环境)

如字面意思,调整系统时间,以达到接近触发计划任务的目的进行调试。

1.3.3 通过脚本日志输出调试定时任务

在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容结果,看是否执行或正确执行。或像下面的内容把脚本结果定向到一个log文件里,重定向>即可,不需要>>追加,这样日志就不会一直变大,如/app/log.log。

#study task by chensiqi at 20170211
00 09,14 * * 0,6 /bin/sh /server/scripts/chensiqi.sh >/app/log.log 2>&1
也可以在脚本里面echo 1 >/tmp/a.log
脚本中加输出
[root@chensiqi ~]# cat tar.sh
cd /
tar zcvf /tmp/etc_$(date +%Y%m%d%H).tar.gz ./etc >/tmp/tmp.log 2>&1

sh -x 显示脚本的执行过程

[root@chensiqi ~]# /bin/sh /server/scripts/chensiqi.sh
2017-02-11
[root@chensiqi ~]# /bin/sh -x /server/scripts/chensiqi.sh
+ date +%F
2017-02-11

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

PATH

在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。

例:

[root@chensiqi ~]# cat /scripts/resin/shell/Task.sh
#!/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
以下省略... 定时任务:
00 09,14 * * * nohup /scripts/resin/shell/Task.sh & >/app/log.log 2>&1
提示:命令也要尽可能写全路径。

1.3.5 通过crond定时任务服务日志调试定时任务

查看定时任务服务日志

[root@chensiqi1 ~]# tail -f /var/log/cron
Feb 10 23:50:01 chensiqi1 CROND[15949]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 10 23:53:01 chensiqi1 CROND[15955]: (root) CMD (/usr/lib64/sa/sa2 -A)
Feb 11 00:00:01 chensiqi1 CROND[15987]: (root) CMD (/usr/lib64/sa/sa1 1 1)
Feb 11 00:01:01 chensiqi1 CROND[15992]: (root) CMD (run-parts /etc/cron.hourly)
Feb 11 00:01:01 chensiqi1 run-parts(/etc/cron.hourly)[15992]: starting 0anacron
Feb 11 00:01:01 chensiqi1 anacron[16003]: Anacron started on 2017-02-11
Feb 11 00:01:01 chensiqi1 anacron[16003]: Jobs will be executed sequentially
Feb 11 00:01:01 chensiqi1 anacron[16003]: Normal exit (0 jobs run)
Feb 11 00:01:01 chensiqi1 run-parts(/etc/cron.hourly)[16005]: finished 0anacron
Feb 11 00:10:01 chensiqi1 CROND[16008]: (root) CMD (/usr/lib64/sa/sa1 1 1)

1.3.6 其他稀奇古怪的问题调试的办法

直接命令行执行无问题而放到定时任务就不行

综合前边1-5的方法就可以解决几乎所有遇到的问题了,此类问题主要是多看crond服务日志,并且把程序输出到指定日志分析。

Linux实战教学笔记13:定时任务补充的更多相关文章

  1. Linux实战教学笔记

    Linux实战教学笔记01:计算机硬件组成与基本原理 Linux实战教学笔记02:计算机系统硬件核心知识 Linux实战教学笔记03:操作系统发展历程及系统版本选择 Linux实战教学笔记04:Lin ...

  2. Linux实战教学笔记11:linux定时任务

    第十一节 linux定时任务 标签(空格分隔): Linux实战教学笔记 ---更多资料点我查看 1.1 定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种 ...

  3. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  4. Linux实战教学笔记10:正则表达式

    第十节 正则表达式 标签(空格分隔):Linux实战教学笔记 ---更多资料点我查看 第1章 什么是正则表达式 正则表达式就是为了处理大量的文本|字符串而定义的一套规则和方法 通过定义的这些特殊符号的 ...

  5. Linux实战教学笔记12:linux三剑客之sed命令精讲

    第十二节 linux三剑客之sed命令精讲 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,前言 我们都知道,在Linux中一切皆文件,比如配置文件,日志文件,启动文件 ...

  6. Linux实战教学笔记21:Rsync数据同步工具

    第二十一节 Rsync数据同步工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转载 ...

  7. Linux实战教学笔记23:Inotify事件监控工具

    第二十三节 inotify事件监控工具 标签(空格分隔): Linux实战教学笔记-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载, ...

  8. Linux实战教学笔记07:Linux系统目录结构介绍

    第七节 Linux系统目录结构介绍 标签(空格分隔):Linux实战教学笔记 第1章 前言 windows目录结构 C:\windows D:\Program Files E:\你懂的\精品 F:\你 ...

  9. Linux实战教学笔记06:Linux系统基础优化

    第六节 Linux系统基础优化 标签(空格分隔):Linux实战教学笔记-陈思齐 第1章 基础环境 第2章 使用网易163镜像做yum源 默认国外的yum源速度很慢,所以换成国内的. 第一步:先备份 ...

随机推荐

  1. 使用crontab,让linux定时执行shell脚本

    阅读目录 1. cron服务[Ubuntu环境] 2. crontab用法 3. 编辑crontab文件 4. 流程举例 5. 几个例子 Linux中,周期执行的任务一般由cron这个守护进程来处理. ...

  2. java反射 顺序输出类中的方法

    java反射可以获取一个类中的所有方法,但是这些方法的输出顺序,并非代码的编写顺序. 我们可以通过自定义一个注解来实现顺序输出类中的方法. 首先,先写一个类,定义增删改查4个方法 public cla ...

  3. 第一篇:使用Spark探索经典数据集MovieLens

    前言 MovieLens数据集包含多个用户对多部电影的评级数据,也包括电影元数据信息和用户属性信息. 这个数据集经常用来做推荐系统,机器学习算法的测试数据集.尤其在推荐系统领域,很多著名论文都是基于这 ...

  4. mysql一库多表查询主键

    mysql> show databases; mysql> use information_schema; mysql> show tables; mysql> select ...

  5. 白话讲session

    什么是session Session一般译作会话,牛津词典对其的解释是进行某活动连续的一段时间.从不同的层面看待session,它有着类似但不全然相同的含义.比如,在web应用的用户看来,他打开浏览器 ...

  6. [转]JAVA的动态代理机制及Spring的实现方式

    JAVA 代理实现 代理的实现分动态代理和静态代理,静态代理的实现是对已经生成了的JAVA类进行封装. 动态代理则是在运行时生成了相关代理累,在JAVA中生成动态代理一般有两种方式. JDK自带实现方 ...

  7. 开关调色新世界BP2888电源解决方案

    LED智能方案经过几年的拼杀,已经风靡照明界.但人们渐渐发现,对照明来说,一味追求花哨的功能并不被市场所认同,而其中开关调色,以其简单易操作的特点,已逐步融入广大消费者的生活习惯中.对吸顶灯,面板灯等 ...

  8. Webdriver+Java实现使用cookie跳过登录

    Webdriver+Java实现使用cookie跳过登录   Webdriver模拟登录过程中很有可能遇到验证码,最近认真学习了下如何使用cookie直接跳过登录过程. 一.cookie的定义 来源百 ...

  9. C语言错题小本子

    int a; ; a = ! x< //a的值是多少 我的答案:0, 正确答案:1 错误原因:没有熟练掌握运算符的优先级 // 找出下面无效的C语言变量名 A. _a B. main C. pr ...

  10. QUICK-AP + BETTERCAP 替换局域网内其他用户的下载文件为自定义文件

    环境需求 :kali系统 , .0版本 :quick-ap :bettercap :bettercap-proxy-modules :...... 主要环境搭建 目的:替换局域网用户的下载文件,变为我 ...