linux crond定时任务 任务调度

Crond定时任务 任务调度

Crond是linux系统中用来定期执行命令或程序任务的服务.一般情况下,安装完操作系统之后,默认便会启动此任务调度服务.crond服务会定期检查系统中是否有要执行的任务工作,如果有,便会根据预先默认的规则自动执行该任务工作.

         Linux任务调度的工作可以分为以下两类:

         ◆系统自身执行的工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理缓存等.

         ◆用户执行的工作:某个用户定期要做的任务工作,例如每隔10分钟和互联网上服务器进行时间同步,每天晚上0点备份站点数据,一般此类这些工作需要由每隔用户自行设置.

1.1指令语法

Crontab [-u user]file

Crontab [-u user]{-l|-r|-e}

1.2指令说明

         通过crontab我们可以在固定的间隔时间执行指定的系统指令或shell script脚本.时间间隔的单位可以是分钟、小时、日、月、周及以上的任意组合.这个命令非常适合周期性的日志分析或数据备份等工作.

1.3使用者权限文件

文件

说明

/etc/cron.deny

该文件中所列用户不允许使用crontab命令

/etc/cron.allow

该文件中所列用户允许使用crontab命令

/var/spool/cron/

所有用户crontab文件存放的目录,以用户名命名

1.4指令选项说明含义表

参数名称

含义

指定示例

-l(字母)

显示用户crontab文件内容.提示:l为list缩写

Crontab –l

-e

进入vi编辑用户crontab文件,e为edit缩写

Crontab –e

-i

删除用户crontab文件前确认提示

Crontab –ri

-r

从crontab目录中删除用户crontab文件

Crontab –r

-u user

指定使用者

Crontab –u oldboy

1.5指令的使用格式

         默认情况下,用户所建立的crontab文件存于/var/spool/cron/目录中,其crontab对应的文件名与用户名一致.

         格式共分为7段,前5段为时间设定段,第6段为以哪个用户执行crontab(默认是当前用户),第7段为所要执行的命令段.

         格式如下:

         01**** root run-parts /etc/cron  hourly      

         024***root run-parts /etc/cront  daily

         224**0root run-parts /etc/cron  weekly

         4241**root run-parts /etc/cron  monthly

1.5.1crontab时间段的含义如表:

含义

取值范围

第一段

代表分钟

00-59

第二段

代表小时

00-23

第三段

代表日期

01-31

第四段

代表月份

01-12

第五段

代表星期几,0代表星期日

0-6(这里为了记忆忽略7)

1.5.2特殊符号含义如下表:

特殊符号

含义

*

表示任意时间都,如0023***command表示无论何月何日何周的23:00执行任务.

-

减号,表示分隔符,表示一个时间范围段,如17-19点,每小时的00分执行任务.00 17-19 ***commond

,

逗号,表示分割时段的意思.30 17,18,19***/bin/sh /scripts/wj.sh每天的17点,18点和19点的半点时刻执行/scripts/wj.sh

*/n

n代表数字,即”每隔n单位时间”,例如:每10分钟执行一次任务:*/10 ****command,其中*/10也可以写成0-59/10

1.6crontab依赖的服务

[root@hcf ~]# chkconfig --list|grep crond

crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off

[root@hcf ~]# /etc/init.d/crond status

crond (pid  36919) is running...

[root@hcf ~]# /etc/init.d/crond restart

Stopping crond:                                            [  OK  ]

Starting crond:                                            [  OK  ]

1.7实例说明

[root@dockers ~]# crontab -l

* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null

* */1 * * * /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type d|xargs chmod 775 2>/dev/null

* */1 * * *  /bin/chown ylm. /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -R 2>/dev/null

 

* * * * 6 /bin/find /var/server/dev3/server/apache-tomcat-8.0.36/logs/ -ctime +5 -type f|xargs -i rm -f {} >/dev/null 2>&1

在上例中除了数字与英文名称,还使用到了符号”*”,这个*号代表每一单位的意思.

第1列为分钟,特殊符号”/”表示每隔的意思,即每隔一分钟执行/bin/find /var/server/dev3/server/apache-tomcat-8.0.36/webapps/e-mall-* -type f|xargs chmod 674 2>/dev/null程序.

  • 30 3,12***/bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第2列为3,12代表3点及12点,此定时任务的意思是每天凌晨3点和中午12点的半点时刻(或者每天凌晨3:30和中午12:30)执行/scripts/wj.sh
  • 30 */6*** /bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第2列*/6代表每6个小时,也相当于6,12,18,24的作用,每隔6个小时的半点时刻执行后面的脚本任务
  • 30 8-18/2 *** /bin/sh /scripts/wj.sh在本例中,其中的第1列为30,表示30分钟,第二列8-18/2代表在早晨8点到下午18点之间每隔2小时,也相当于8,10,12,14,16,18的作用,早晨8点到下午18点之间每隔2小时的30分时刻执行后面脚本
  • 30 21***/application/apache/bin/apachectl graceful每晚的21:30重启apache
  • 45 4 1,10,22**/application/apache/bin/apachectl graceful每月1,10,22日的凌晨4:45分重启apache
  • 10 1** 6,0/application/apache/bin/apachectl graceful每周六周日的凌晨1:10分重启apache
  • 0,30 18-23***/application/apache/bin/apachectl graceful每天18点到23点的0分和30分时重启apache,提示:最后一次执行任务是23:30分
  • 00 */1 ***/application/apache/bin/apachectl graceful每隔1小时整点重启apache
  • * 23-7/1 ***/application/apache/bin/apachectl graceful晚上23点到早上7点之间,每隔1小时重启apache  提示:以上结果是不对的,为什么?以上定时任务的第一列为*,表示每分都执行任务即表示晚上23点到早上7点之间,每小时的每分钟都重启apache,很可怕.
  • 0 11 * 4 1-3/application/apache/bin/apachectl graceful4月的每周一到周三的11点重启apache

1.8crontab命令生产环境专业写法

把所有的任务,写入到一个可执行文件(shell编程),由crond调用执行文件.

例1:每分钟打印一次自己的名字到/server/log/自己的名字命名的文件中.

答案:

#print char task by wj for programmer A at 2010-12-12

*/1 **** echo “wj” >>/server/log/wj.log 2>&1

例2:每周六、日上午9:00和下午14:00去学习linux运维

答案:

#cron job for ett by wj 2010-12-12

00 9,14 **6,0 /bin/sh /server/script/wj.sh>dev/null 2>&1

针对以上两生产例子说明:

  • 写定时任务要写清注释是个好习惯,如:什么人,什么时间,因为谁,做了什么事.都标记

清楚了,这样其他维护人员可以很容易理解.如wj于2016-12-12日在A服务器上做了每10分钟同步时间的操作(如果是开发的任务可以写上需求人).

  • 执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh,否则有可能脚本没执行

权限而无法执行.

  • 需要root权限执行的任务可以登录到root用户下然后设置,如果不需要root权限,

可以登录到普通用户下,然后设置.这里要特别注意不同用户的环境变量问题,如果是调用了环境变量(如生产场景java脚本),此时,最好在脚本中将环境变量重新export下.

  • 定时任务命令的结尾最好加上>/dev/null 2>&1等内容,如果需要打出日志,可以追加到

指定的日志里,不推荐留空这种不专业的做法.

         其中,/dev/null为特殊的设备,表示黑洞设备或空设备.2>&1使标准错误和标准输出一样,本命令内容即把脚本的输出重定向到/dev/null,即不记录任何输出,也不给系统发邮件.

    如果定时任务不加>/dev/null 2>&1等命令配置,时间长了,可能会导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘空间.

提示:上面写法也可以写成1>/dev/null 2>/dev/null,例子 $JAVA-jar

$RESIN_HOME/lib/resin.jar$ARGS stop 1>/dev/null 2>/dev/null来自resin默认启动脚本

  • 在开发定时任务程序或脚本时,在调试好脚本程序后,应尽量把DEBUG及屏幕输出的内

容的命令去掉,如果还需要,可定向到日志里.

1.9crontab生产解决案例

案例1:no space left on device故障1

         在设置crontab时提示No space left on device,用df –k 检查还有空间,用df –i显示/var已占用100%,如果inode耗尽,则系统上将不能创建文件.

         在/var/spool/clientmqueue/下有超多的文件,ls半天没反应,用rm –rf *会自动跳出root,然后用xargs来配合解决.cd /var/spool/clientmqueue&&ls|xargs rm –f

         最后清理了该目录中的内容.当然,如果文件数超多,执行ls|xargs rm –f也会长时间无反应,此时,也可以直接cd /var/spool&&rm  -rf  clientmqueue,然后mkdir clientmqueue&&chmod 770 clientmqueue && chown smmsp.smmsp –R /var/spool/clientmqueue。系统中/var/spool/clientmqueue目录默认权限为:

原因分析:系统中cron执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;

解决办法:开启邮件服务,并将crontab里面的命令后面加上>/dev/null 2>&1,在做定时脚本时,把屏幕输出定向到日志中.

案例2:No space left on device 故障2

1.wnen you create a new directory or file ,system will say :no space left on device

         mkdir ett

         mkdir:cannot create directory ett:No space left on device

2.when create crontab for account ett,you will receiveerror information as follows:

         “Crontab.6655” 1L

         Crontab:installing new crontab

         Cron /tmp.6655:No space left on device

         Crontab:edits left in /tmp/crontab.6655

解决过程:

  • 检查分区使用率:df –lk使用最多分区/var的使用率只有79%,硬盘空间还够用.
  • 检查/var/lock下的文件,删除/var/locks/subsys/nfs后,touch /var/ett,成功创建文件,删除/var/ett
  • 发现删除/var/lock下的任意一个文件后,都可以成功创建一个文件,再创建就会失败.

Touch /var/ett 成功  touch /var/ett1失败

Touch:creating ett1:No space left on device.

  • 将检查扩大到/var下的其他目录

cd /var/www/icons     mv  a.gif /tmp   mv a.png /tmp   --------移走两个文件

df –li  touch ett   touch bb   touch cc 

touch:creating  cc:No space left on device ------------只能创建两个文件,当创建第三个文件时,出错

  • 怀疑分区/var的inode用尽导致上述问题,检查inode使用率

df –li

发现/var的inode使用率已经达到100%,空余的inode为0

  •  分区/var没有配置quota,平均每个inode的占用空间为:497829k(var分区大小)/128520(inodes)=3.87k,说明分区的最小block为4k,无法增加inode限额.
  • 发现/var/spool/clientmqueue下面有太多的文件,共有127679个,占用了127679/128520(inodes)=99.3%的inode节点数,由于系统 的邮件服务配置有问题,导致系统发出的邮件堆积在队列目录中,占用的大量的inode节点.

处理方法:确认/var/spool/clientmqueue下的文件已经无用后,删除之.然后/var写

                入正常.

最好的解决办法是重新设置系统邮件,使其能正常发送或找到发邮件的源头,如

                   本文的crontab任务.

删除文件后的inode使用情况. df –li

         案例3:No space left on device 故障还原

                   本案里借鉴了http://blog.sina.com.cn/s/blog_4dd475390100c47m.html文章,并进行了实践还原故障.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值