linux定时任务crond服务应用指南

Linux的定时任务crondcrontab)服务

1crond是什么?

crondlinux系统中用来定期执行命令或者指定程序的程序(软件)

2、秒级任务

         1crond需要方式实现

         2)自己写守护进程shell循环

         3Quartz也可实现妙计任务

3、定时任务的作用

         服务器:7*24小时开机提供服务是网站的基本特征

         有重要数据:提高备份周期和备份数量

 

Linux的定时任务分类

linux系统中定时任务调度的工作可以分为一下两种

1)系统自身的定期执行的任务

         系统周期性自行执行的任务工作。如轮询系统日志、备份系统数据、清理系统缓存等

[root@ysolin ~]# ls -l /var/log/messages*    系统的日志

-rw-------. 1 root root 201123 6月  28 14:44 /var/log/messages

-rw-------. 1 root root 200796 6月  26 03:49 /var/log/messages-20160626

系统自动轮询任务的设置配置路径:

[root@ysolin ~]# ls -l /etc/ |grep cron

-rw-------.  1 root root    541 11月 23 2013 anacrontab

drwxr-xr-x.  2 root root   4096 6月  24 18:13 cron.d

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.daily

-rw-------.  1 root root      0 11月 23 2013 cron.deny

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.hourly

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.monthly

-rw-r--r--.  1 root root    457 9月  27 2011 crontab

drwxr-xr-x.  2 root root   4096 9月  27 2011 cron.weekly

2)用户执行的定时任务

         某个用户或系统管理员定期要做的任务工作,用户执行放入任务工作,也就是我们运维管理人员执行的任务工作。

         例如:服务器时间同步

[root@ysolin ~]# crontab -l #查看定时任务

time sync by solin

*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

2Linux系统下定时任务软件种类

1at适合执行一次就结束的调度任务。依赖服务atd

2anacron适合于非7*24小时开机的服务准备。anacron并不能指定具体时间执行任务工作,而是以天为周期或者在系统每次开机后执行的任务工作,它会检测服务器停机期间应该执行,但没有执行的任务工作,并将该任务执行一遍。

3crondcrond服务默认情况(每分钟),会检查系统中是否有需要执行的定时任务,若有会根据定义好的规则来执行这个定时任务。

注:

1crond服务是运行的程序,而crontab命令用户用来设置定时规则的命令

2crond服务是企业生产工作中常用的重要服务,atanacron很少使用,可以忽略。

定时任务crond使用说明

1、语法指令

crontab [-u user] {-l | -e | -r |-i}

查看帮助

[root@ysolin ~]# crontab --help

crontab: invalid option -- '-'

crontab: usage error: unrecognized option

usage:     crontab [-u user] file

      crontab [-u user] [ -e | -l | -r ]

           (default operation is replace, per 1003.2)

      -e    (edit user's crontab)

      -l    (list user's crontab)

      -r    (delete user's crontab)

      -i    (prompt before deleting user's crontab)

      -s    (selinux context)

2、指令说明

         通过crontab我们可以在固定的间隔时间执行指定的系统指令或script脚本。时间间隔的单位是分、时、日、月、周及以上的任意组合。

3、使用者权限文件

    文件                            说明

    /etc/cron.deny         #该文件中所列用户不允许使用crontab命令

    /etc/cron.allow        #该文件中所列用户允许使用crontab命令,优先于/etc/cron.deny

    /etc/spool/cron/      #所有用户crontab配置文件默认都存在此目录,文件名以用户名命令

    注:

    crontab -e = vi /var/spool/cron/root

    crontab -l = cat /var/spool/cron/root

4、指令选项说明含义表

         -e      (edit user's crontab)                                              #编辑crontab文件内容

         -l       (list user's crontab)                                                #查看crontab文件内容

         -r      (delete user's crontab)                                         #删除crontab文件内容

         -i       (prompt before deleting user's crontab)          #删除crontab文件内容,删除前会提示。

         -u               #指定使用的用户执行任务

 

5、指令的使用格式

         1crond语法格式中时间段的含义

[root@ysolin ~]# 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

         2crontab语法格式中特殊符号含义

*       # *号,表示任意时间,如每分、每小时、每日、每月、每周

         -        # 减号,表示分隔符,表示一个范围区间

     # 逗号,表示分割时间段的意思。

/n     # n代表数字,即“每隔n单位时间”

         3crontab依赖服务

[root@ysolin ~]# chkconfig --list crond

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

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

crond (pid  1430) is running...

[root@ysolin ~]# ps -ef |grep crond | grep -v grep

root       1430      1  0 Jun28 ?        00:00:00 crond

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

Stopping crond:                                            [  OK  ]

Starting crond:                                            [  OK  ]

定时任务crond实例说明

范例1:每五分钟同步一次系统时间

[root@ysolin ~]# vi /var/spool/cron/root

[root@ysolin ~]# echo 'time sync by solin' >>/var/spool/cron/root

[root@ysolin ~]# echo '*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1' >>/var/spool/cron/root

[root@ysolin ~]# crontab -l

time sync by solin

*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

范例2:每个月11020日的凌晨3:30分重启apache

30 3 1,10,20 * * /application/apache/bin/apachectl graceful

生产环境crond专业实例

         1、规范定时任务两例(练习)

         1)每分钟打印一次solil/var/log/solin.log

[root@ysolin ~]# crontab -e

      添加任务

      #print my name to log

      * * * * * echo solil >>/var/log/solin.log

 

[root@ysolin ~]# crontab -l

#time sync by solin

*/5 * * * * /sbin/ntpdate time.windows.com >/dev/null 2>&1

#print my name to log

* * * * * echo solil >>/var/log/solin.log

[root@ysolin ~]# cat /var/log/solin.log

solil

solil

solil

         2)周期任务使用脚本每周六、日上午九点和下午两点(周期)打印时间(格式:****-**-**

创建脚本

[root@ysolin ~]# date +%F

2016-06-29

[root@ysolin ~]# echo 'date +%F' >scripts/date.sh

[root@ysolin ~]# cat scripts/date.sh

date +%F

[root@ysolin ~]# sh scripts/date.sh

2016-06-29

设置定时任务

[root@ysolin ~]# echo "#print date " >>/var/spool/cron/root

[root@ysolin ~]# echo "00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1" >>/var/spool/cron/root

[root@ysolin ~]# crontab -l |tail -2

#print date

00 09,14 * * 6,7 /bin/sh /root/scripts/date.sh >/dev/null 2>&1

注:确保调用的命令是可执行的;路径需要绝对路径

2、书写crond定时任务基本要领

(1)为定时任务命令加必要的注释

  写定时任务规则时尽可能的加上注释(最好是英文英文注释),方便后期更高改,其他运维人员理解定时任务的内容

(2)执行脚本任务前加/bin/sh

  执行定时任务时,如果是执行脚本,请尽量在脚本后面带上/bin.sh命令,防止脚本没有执行权限而出错

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

  2>&1表示让标准错误和标准输出一样,即把脚本正常和错误输出都都重定向到/dev/null,不记录任何输出。

  >/dev/null 2>&1等价于1>/dev/null 2>/dev/null 等价于 &>dev/null

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

(4)定时任务或层序最好在脚本里执行

(5)在指令用户下执行相关定时任务

  需要root权限执行的任务可以登录到root用户然后设置,如果不需要root权限,可以登录到普通用户(也可以直接在root下c’ron’tab -u solin -e的方式直接设置)设置。不同用户环境问题:如果调用了环境变量/etc/profile (如生产环境中java程序的定时任务),最好在程序脚本中,将用的到环境变量重新export下

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

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

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

(8)配置定时任务规范操作过程,防止出错。

  首先要在命令行操作成功,然后复制成功的命令到脚本里,减少配置定时任务错误;

  然后测试脚本,测试成功后,复制脚本的规范路径到定时任务里;

  现在测试环境下测试,然后正式环境规范部署。

         3、系统定时任务配置

轮询日志

[root@ysolin ~]# ll /var/log/messages* #系统报错日志

-rw-------. 1 root root 201538 6月  29 19:48 /var/log/messages

-rw-------. 1 root root 200796 6月  26 03:49 /var/log/messages-20160626

[root@ysolin ~]# ll /var/log/secure* #安全信息和系统登录与网络连接的信息

-rw-------. 1 root root 8562 6月  29 23:43 /var/log/secure

-rw-------. 1 root root 6490 6月  26 01:45 /var/log/secure-20160626

[root@ysolin ~]# ls /etc/cron.daily/

logrotate

[root@ysolin ~]# cat /etc/cron.daily/logrotate # logrotate 程序是一个日志文件管理工具

#!/bin/sh

 

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1

EXITVALUE=$?

if [ $EXITVALUE != 0 ]; then

    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi

exit 0

[root@ysolin ~]# cat /etc/logrotate.conf # logrotate 的配置文件

# see "man logrotate" for details

# rotate log files weekly

weekly

 

# keep 4 weeks worth of backlogs

rotate 4

 

# create new (empty) log files after rotating old ones

create

 

# use date as a suffix of the rotated file

dateext

 

# uncomment this if you want your log files compressed

#compress

 

# RPM packages drop log rotation information into this directory

include /etc/logrotate.d

 

# no packages own wtmp and btmp -- we'll rotate them here

/var/log/wtmp {

    monthly

    create 0664 root utmp

      minsize 1M

    rotate 1

}

 

/var/log/btmp {

    missingok

    monthly

    create 0600 root utmp

    rotate 1

}

 

# system-specific logs may be also be configured here.

         4、企业生产环境如何调试crond定时任务(个人建议)

         1)增加执行频率调试任务

                   在调试时,把任务执行周期缩短,测试出定时任务效果

                   规范的操作流程(开发和运维人员):

                            个人的开发配置环境è办公室的测试环境èIDC机房的测试环境èIDC机房的正式环境

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

                   把系统的时间调整为定时任务执行的前五分钟,确保定时任务能够正确执行。

         3)通过日志输出调试定时任务

                   在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容结果,看是否执行或正确执行。

         4)注意一些任务命令带来的问题

           如:*/1 * * * * * echo “Hello Word” >> /tmp/solin.log >/dev/null 2>&1

           因前面已经有了重定向,后面要去掉/dev/null 2>&1

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

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

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

[root@ysolin ~]# tail -f /var/log/cron

Jun 30 02:00:01 ysolin CROND[3537]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:01:01 ysolin CROND[3541]: (root) CMD (run-parts /etc/cron.hourly)

Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3541]: starting 0anacron

Jun 30 02:01:01 ysolin anacron[3550]: Anacron started on 2016-06-30

Jun 30 02:01:01 ysolin anacron[3550]: Jobs will be executed sequentially

Jun 30 02:01:01 ysolin anacron[3550]: Normal exit (0 jobs run)

Jun 30 02:01:01 ysolin run-parts(/etc/cron.hourly)[3552]: finished 0anacron

Jun 30 02:05:01 ysolin CROND[3555]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:10:01 ysolin CROND[3559]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

Jun 30 02:15:01 ysolin CROND[3563]: (root) CMD (/sbin/ntpdate time.windows.com >/dev/null 2>&1)

crond定时任务生产应用问题10箴言

1、系统环境变量问题

2、定时任务绝对路径

3、脚本权限问题加/bin/sh

4、时间变量问题用反斜线

5>/dev/null 2>&1,防止磁盘空间(inode)被占满

6、定时任务规则之前加注释

7、使用脚本程序代替命令行定时任务

8、避免不必要的程序及命令输出

9、切到目标目录的上一级打包目标

10、定时任务脚本中的程序命令用全路径

crond生产环境案例及解决过程

1No space left on davice生产环境故障

问题描述:

      工作中设置crontab定时任务时任务规则保存时,提示“No space left on davice”,此时df -h检查磁盘,发现磁盘有空余空间,用df -i检查则发现/var目录已占用100%的inode数量。

最后检查发现/var/spool/clientmqueue/下有大量的文件,执行cd /var/spool/clientmqueue ;rm -f * 自动跳出,无法删除

故障分析:

      当系统中crond定时任务执行的程序有输出内容时,输出的内容会以邮件的形式放送给crond的用户(默认是root),而sendmail等服务没有开启的时,这些邮件内容就会在邮件队列临时目录中产生文件,导致消耗inode数量,一旦indode数量耗尽就会导致系统无法写入文件而报错:No space left on davice

解决方式:

1)删除目录或文件

[root@ysolin ~]# cd /var/spool/clientmqueue && ls |xargs rm -f

或者

[root@ysolin ~]# cd /var/spool && rm -rf clientmqueue

[root@ysolin ~]# mkdir clientmqueue && chmod 770 clientmqueue && chown smmsp.smmsp -R /var/spool/clientmqueue

2)修改定时任务,添加 >/dev/null 2>&1

 

2No space left on davice生产环境故障

理论:

inode译成中文就是索引节点,每个存储设备(例如硬盘)或存储设备的分区被格式化为文件系统后,应该有两部份,一部份是inode,另一部份是Block,Block是用来存储数据用的。

而inode,就是用来存储这些数据的信息,这些信息包括文件大小、属主、归属的用户组、读写权限等。inode为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,能通过inode值最快的找到相对应的文件。

常见问题:No space left on device

解决思路

1)查看分区使用情况:

[root@ysolin ~]# df -lk

查看分区使用情况

2)查看inode使用信息:

[root@ysolin ~]# df -i

#查看inode使用信息

解决方式:

(1)find锁定占用空间最大的目录(通常目录大小越大,表示目录下的文件越多)

(2)删除多余的inode节点。(find /xxx -type f -exec rm {} \;)

如:

查看系统空间使用最多的文件

find / -type f -size -1k | xargs -i dirname {} | sort  -nr| uniq -c | sort -nr | tail

删除:(一定要确定是自己的站点,而且所删除的东西已经不重要)

find /路径/路径 -size -1k -type f | xargs rm -f

原文: