Linux之定时任务补充
定时任务两实例
例1: 每分钟打印一次自己的名字拼音全拼到“/server/log/自己的名字命名的文件”中。
[root@chengliang log]# mkdir -p /server/log/
[root@chengliang log]# echo "chensiqi" >>/server/log/chengliang
[root@chengliang log]# crontab -l
#time sync by zcl at 2017/5/8
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
[root@chengliang log]# crontab -e ==>设置定时任务,加上下面这两句
#print my name to log by zcl at 2017/5/12
*/1 * * * * /bin/echo "my name is zcl" >> /server/log/chengliang
[root@chengliang log]#
错误示例:
#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可以随意。
解答:
##execute chengliang.sh by zcl at 2017/5/14
00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1
步骤:
1、创建对应的目录
mkdir /server/scripts -p
2、命令行测试
[root@chengliang log]# date +%F
2017-05-14
[root@chengliang log]#
3、书写脚本
[root@chengliang scripts]# echo 'date +%F' >/server/scripts/chensiqi.sh
[root@chengliang scripts]# cat chengliang.sh
date +%F
[root@chengliang scripts]#
4、命令行测试脚本
[root@chengliang scripts]# /bin/sh /server/scripts/chengliang.sh
2017-05-14
[root@chengliang scripts]#
5、编辑定时任务(让他快速执行* * * * *)
crontab -e
==>增加下面的定时任务
*/5 * * * * /bin/sh /server/scripts/chensiqi.sh >>/server/log/chengliang.log
6、测试
tail -f /server/log/chengliang.log
2017-5-14
7、按照原来的要求更改定时任务的时间
##execute chengliang.sh by zcl at 2017/5/14
00 9,14 * * 0,6 /bin/sh /server/scripts/chengliang.sh >/dev/null 2>&1
定时任务书写要领
- 要领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
要领7:定时任务命令或程序最好写到脚本里执行
要领8:定时任务执行的脚本要规范路径
例如:/server/scripts
- 要领9:配置定时任务规范操作过程,防止出错。
1,首先要在命令行操作成功,然后复制成功的命令到脚本里,在各个细小环节减少出错的机会。
2,然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。
3,先在测试环境下测试,然后正式环境规范部署
在命令行输入./chensiqi.sh(/server/scripts/chensiqi.sh)与sh chensiqi.sh区别在哪?
[root@chengliang scripts]# ls
chengliang.sh
[root@chengliang scripts]# sh chengliang.sh
2017-05-14
[root@chengliang scripts]#
[root@chengliang scripts]# ./chengliang.sh
-bash: ./chengliang.sh: Permission denied
[root@chengliang scripts]#
命令说明: sh chensiqi.sh表示用/bin/sh这个命令来解析并启动chensiqi.sh这个脚本。而./chensiqi.sh表示利用linux的默认解释器来解析并启动这个脚本。因此,./chensiqi.sh需要linux下x的执行权限,而sh chensiqi.sh不需要
定时任务不加>/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.x sendmail临时邮件文件目录,有很多原因会导致这个目录碎文件很多,比如crontab定时任务命令不加>/dev/null等,并且sendmail服务没开。工作中偶尔会因为该目录文件太多,导致/var所在的分区inode数量被消耗尽,无法写入文件的情况 |
/var/spool/postfix/maildrop/ | centos6.x postfix临时队列目录/var/spool/postfix/maildrop/默认定时任务执行时会给root发邮件,如果邮件服务不开,就会把邮件推到上述目录。当定时任务结尾不加>/dev/null 2>&1的时候,定时任务就会在上述目录存大量小文件 |
定时任务的系统配置文件/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=/ #定时任务执行命令从根目录开始
root用户执行crontab -e命令实际修改的是/var/spool/cron/root的root文件
[root@chengliang scripts]# cat /var/spool/cron/root
#time sync by zcl at 2017/5/8
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
增加执行任务频率调试任务(某些任务不能用于生产环境)
在调试时,把任务执行频率调快一点,如:每分钟,每5分钟执行一次,或者比当前时间推迟5分钟以后,看能否执行,是不是按照你想象的去执行了,如果正常没问题了,在改成需要的任务的执行时间。
强调:有些计划任务是不允许频繁执行的,例如:定时往数据库里插入数据,这样的任务就要在测试机上测试好,然后部署到正式线上,这样正式工作出问题的机会就少了。
规范的公司开发和运维人员操作流程,个人的开发配置环境-->办公室的测试环境-->idc机房的测试环境-->idc机房的正式环境。
参考博客: http://www.cnblogs.com/chensiqiqi/p/6389611.html
Linux之定时任务补充的更多相关文章
- Linux实战教学笔记13:定时任务补充
第十三节 定时任务补充 标签(空格分隔): Linux实战教学笔记 ---[更多资料点我查看][1] 1,生产环境常用Crontab专业实例 1.1书写crontab定时任务多个基本要领 1.1.1 ...
- Linux系统定时任务crond那些事
1 Linux系统定时任务 1.1 定时任务介绍 1.1.1 Crond是什么? Crond是linux系统中用来定期执行命令或指定程序任务的一种服务或软件.Centos5/ linux系统安装完操作 ...
- LINUX 添加定时任务
LINUX 添加定时任务 crontab - l按 i:x 先按 esc然后 敲入 命令 :x*/5 3 * * 0 /root/ v.sh ..重启服务 service crond restart
- Linux之定时任务Crond使用
Linux之定时任务Crond使用 一.用法 crond服务是linux系统自带的服务,是不需要手动安装的: crond服务是一种守护进程: Linux中的用户使用contab命令来配置corn任务: ...
- linux创建定时任务,定时执行sql
终于弄清楚一个问题了.linux创建定时任务,定时执行sql,其中分为两个case. case-1 sql语句较少,因此直接在 shell脚本中 写sql语句.如下: [oracle@Oracle11 ...
- Linux 新建定时任务
Linux 新建定时任务: 1.查看指定用户列表: crontab -u apache -l 2.切换至对应用户,这里是apache su apache 3.新增定时任务: crontab -e 写入 ...
- 【Python】Linux crontab定时任务配置方法(详解)
CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行. cron 系统调度进程. 可以使用它在 ...
- Linux之定时任务Crond介绍
Linux之定时任务 定时任务Crond介绍 Crond是linux系统中用来定期执行命令/脚本或指定程序任务的一种服务或软件,一般情况下,我们安装完Centos5/6 linux操作系统之后,默认便 ...
- linux设置定时任务的方法(自己总结)
Linux设置定时任务步骤 linux设置定时任务的关键字是:crontab 1:查看现在已经有的定时任务的命令是 crontab -l,执行命令如下图: 2:新建定时任务的命令是:crontab ...
随机推荐
- angular.js实现省市区三级联动指令
不多说,直接上代码,一开始搞了好久,最后才弄懂,希望对大家有帮助 1.jade div.col-md-2 select.form-control(ng-options="value.code ...
- 手机端的viewport属性
Window.devicePixelRatioThis read-only property returns the ratio of the resolution in physical pixel ...
- 2017PHP程序员的进阶之路
2017PHP程序员的进阶之路 又是一年毕业季,可能会有好多毕业生即将进入开发这个圈子,踏上码农这个不归路.根据这些年在开发圈子总结的LNMP程序猿发展轨迹,结合个人经验体会,总结出很多程序员对未来的 ...
- 阿里云服务器:IIS网站的架设(一、环境设置与安装IIS网站 二、网站的基本设置 三、建立新网站(未完待续))
Windows Server 2012 R2的Internet Information Services (IIS)网站的模块化设计,可以减少被攻击面并减轻管理负担,让系统管理员更容易架设安全的具备高 ...
- 刨根究底字符编码之十——Unicode字符集的字符编码方式CEF
Unicode字符集的字符编码方式CEF 一.字符编码方式CEF的选择 1. 由于Unicode字符集非常大,有些字符的编号(码点值)需要两个或两个以上字节来表示,而要对这样的编号进行编码,也必须使用 ...
- cas4.2.7与shiro进行整合
准备工作 cas单点登录开始前准备,请参考cas4.2.7实现单点登录. 与shiro进行整合 注:准备工作的基础上,对cas客户端进行如下改进. 引入相关jar包 shiro-cas-1.2.6.j ...
- VR上天了!全景商业化落地了!——VR全景智慧城市
几年前,VR创业公司SpaceVR就启动了旨在将宇航员视觉体验带给普通人的虚拟现实(VR)项目.SpaceVR计划将VR相机卫星送入太空,并将相机拍摄到的太空视频发送回地球,从而让VR用户身临其境地看 ...
- 从零开始——PowerShell应用入门(全例子入门讲解)
学习一门技术,不止要会,还要善用,例子就是带你快速入门的最佳利器.本文就是要用例子,不,大量的例子来带你走进PowerShell应用世界. 本文主要介绍一些PowerShell入门的基础知识,对技术小 ...
- javaSE_05Java中方法(函数)与重载、递归-练习
1.使用的递归的方法求5! public class DiGui{ public static void main(String[] args){ //使用的递归的方法求5! System.out.p ...
- C#实现SQLSERVER数据库中有序GUID生成(NewSequentialId)
GUID作为数据库主键由于其无序性所以性能不怎么好,SQL Server中有个函数NewSequentialId可以生成有序的GUID,由于在程序中需要用到,就用C#实现了一下,生成的GUID格式基本 ...