• CentOS下crond定时任务详细介绍


    目录

    1、定时任务crond介绍... 

    2、crond定时任务限权... 

    3、Crontab用法... 

    4、Crontab命令的书写格式... 

    5、定时服务器时间同步... 

    6、写定时任务注意点..

    7、调试定时任务... 

     

     

     

    1、定时任务crond介绍

     

    1>定时任务软件种类

    at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务。

    crontab 需要启动一个服务crond才行,crond服务通过crontab命令实现。

    anacron 无法周期性执行,只能以天为周期,但有个特点,在关机状态下未执行的任务,下次开机时可以补上执行

    注:crontab为最常用的定时任务。

     

    2>crontab工作

    运行linux后,开机自启动crond任务,系统会每分钟检查是否有要执行的任务工作(循环检测)

    默认系统中可以登陆的用户,都可以使用crontab定义计划任务。不过,可以通过/etc/cron.allow文件限制权限。

     

    3>crontab支持两种状态:

    a.直接编写计划任务;

    b.使用目录的方式,放在目录里面的都会定时执行,定时目录可在/etc/crontab中设定。

     

    2crond定时任务限权

    可对各用户使用定时任务进行管理

     

    1)拒绝用户使用crontab任务

    /etc/cron.deny中添加要拒绝的用户名,格式如下:

    listen

    nobody

    noaccess

    username1

    username2

    username3

    .

     

    2)允许用户访问crontab任务

    /etc/cron.allow中添加要允许的用户名,格式如下:

    root

    username1

    username2

    .

     

    3)定期执行一个目录下的文件

    /etc/crontab中添加目录,格式如下:

    01 * * * * root run-parts 目录

    注:使用run-parts可定义定期执行的目录

     

    4)限权测试

    1>添加用户

    [root@test ~]# useradd test

    [root@test ~]# echo 123456 |passwd test--stdin  #<==非交互模式创建密码

    Changing password for user test.

    passwd: all authentication tokensupdated successfully.

     

    2>拒绝测试

    [root@test ~]# cat /etc/cron.deny 

    test

    [root@test ~]# 

    [root@test ~]# su - test

    [test@test ~]$ crontab -e

    You (test)are not allowed to use this program (crontab)

    See crontab(1) for more information

    cron.deny中加入用户后,该用户没有权限编辑定时任务

     

    3>允许测试

    [root@test ~]# cat /etc/cron.allow

    test

    [root@test ~]# su - test

    [test@test ~]$ crontab -e   #<==test用户编辑成功

    */1 * * * * echo successful >/tmp/a.log

    [test@test ~]$ crontab -l

    */1 * * * * echo successful >/tmp/a.log

    cron.allow中加入用户后,该用户能编辑定时任务

     

    4>清空允许用户

    [test@test ~]$ su - root

    Password: 

    [root@test ~]# echo >/etc/cron.allow

    [root@test ~]# su - test

    [test@test ~]$ crontab -l  #<==test用户连查看的权限都没有

    You (test)are not allowed to use this program (crontab)

    See crontab(1) for more information

    [test@test ~]$ cat /etc/cron.deny

    test

    清空cron.allow允许用户后,该用户又被cron.deny拒绝,

    得出结论:/etc/cron.allow优先于/etc/cron.deny配置

     

    3Crontab用法

     

    [root@yang1 data]# crontab --help   #<==注:crontab –l –e都是直接操作/var/spool/cron/当前用户名的文件

    usage: crontab [-u user] file    #<==指定某用户crontab –u yang2 –e,编辑yang2家目录下的crontab

        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 deletinguser's crontab) #<==删除crontab文件内容,删前会有提示

        -s   (selinux context)

    注:crontab –e 编辑定时任务,退出时可以检查语法,直接编辑/var/spool/cron/root不能。如果大批量添加任务,则使用echo追加。

    cron执行的每一项工作都会被纪录到/var/log/cron这个日志文件中,可以从这个文件查看命令执行的状态。

     

    4Crontab命令的书写格式

     

      *      *     *      *     *    /bin/sh /scripts/yy.sh

      分     时     日     月     周    命令和文件路径

    (00-59)  (0-23)   (1-31)   (1-12)    (0-6)         

     

    所用符号表示意思

    星号每的意思

    减号连续一段时间,如:00 17-19 * * * cmd  每天下午17点,18点,19点执行一次命令

    逗号多个时间段,如:00 10-11,17-19 * * * cmd 每天的上午10,11点整,下午的17,18,19点整执行一次命令

    /n n代表数字,指每隔n时间执行一次,如: */2 * * * * cmd 每隔2分钟执行一次命令

     

    1)举例:

    30 12-16/2 * ** cmd 

    每天的中午12点到下午4点间,每隔2小时执行一次

    * 23-7/1 * * 25pxd 

    注:这是一个错误的命令

    日和周不能同时用,若要以月为间隔,则日或周必有一个有值

    其它如:小时上有值,则分钟上也要有值

    */1 * * ** echo yangrong >>/var/log/yy > /dev/null 2>&1

    每隔一分钟把yangrong打印到yangrong1文件中,但该命令无法执行,因为>>>/dev/null不可同时使用

     

    2)/dev/null 2>&1解释

     

    0是标准输入    使用<或<<

    1是标准输出    使用>或>>

    2是标准错误输出  使用2>或2>>

    >/dev/null 2>&1  即错误输出与标准输出全部重定向到空,可以写成1>/dev/null 2>/dev/null

     

    3)关于重定向的作用

    重定向到空可以避免碎片文件占用inode资源

    重定向到一个指定log里,可以看任务是否执行

     

    4)关于导致磁盘inode满情况分析

    定时任务执行成功or失败时,程序会向上层发送mail,由于平时工作中不打开sendmail功能,所以邮件会存储在临时目录/var/spool/clientmqueue,随着执行的任务次数多,文件也会越来越多,直到某一天,添加文件时,提示No space left on device主要问题原因不在于垃圾文件会占很大空间,而在于每个文件会占用inode节点。centos6.4默认不装sendmail,可能不会导致这个问题发生)。

    所以crontab规则后需加 /dev/null 2>&1

    注:>>  >/dev/null 2>&1不可同时存在,不然无法执行

     

     

    5)重启crond服务

    /etc/init.d/crond status  #查看当前运行状态

    /etc/init.d/crond restart #重启

    /etc/init.d/crond reload  #平滑重启

     

    5、定时服务器时间同步

     

    1)手动同步

    [root@yang1 data]# which ntpdate

    /sbin/ntpdate

    [root@yang1 data]# /sbin/ntpdate time.windows.com

     

    2)自动同步(使用定时任务)

    #sync systime by yangrong at 2013-9-4         

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

    注:当局域网内的服务器足够多时(500+),则需自己在局域网搭建ntp server

     

     

    6、写定时任务注意点:

    掌握了下面7点,写定时任务就不在犯错。

    序号

    注意点

    1

    每个任务添加注释,谁写的,什么时间写的,完成什么需求?

    2

    执行脚本使用/bin/sh(防止脚本无执行权限),要执行的文件路径是从根开始的绝对路径(防止找不到文件)

    3

    尽量把要执行的命令放在脚本里,然后把脚本放在定时任务里。对于调用脚本的定时任务,可以把标准输出错误输出重定向到空。

    4

    定时任务中带%无法执行,需要加转义

    5

    如果时上有值,分钟上必须有值

    6

    日和周不要同时使用,会冲突

    7

    >>>/dev/null 2>&1不要同时存在

    书写举例:

    #backup mysql byyangrong at 2013-9-4

    30 4 * * * /bin/shtar_mysql.sh >/dev/null 2>&1 

     

    7、调试定时任务

    一个任务不能轻易的直接推上线上服务器,需要在测试服务器上测试好。

     

    序号

    调试方法

    1

    增加频率调试任务,如:生产环境2小时一次,测试机2分钟一次

    2

    加快时间调试任务,如:生产环境1天后执行,则添加任务后修改设备时间

    3

    重定向到一个日志里,查看任务执行情况。一个是定时任务后加log,一个是脚本后加log

    4

    环境变量可能导致问题

    5

    通过日志定位问题。  tail /var/log/cron

  • 相关阅读:
    算法系列二:排序
    算法系列一:简单排序
    自己实现数据结构系列五---BinarySearchTree
    自己实现数据结构系列四---Queue
    自己实现数据结构系列三---Stack
    自己实现数据结构系列二---LinkedList
    自己实现数据结构系列一---ArrayList
    栈--数组实现
    RequestHolder工具类
    IP工具类
  • 原文地址:https://www.cnblogs.com/doseoer/p/5731600.html
Copyright © 2020-2023  润新知