• 已整理Linux定时任务服务crond


    目录:

      1、Linux 计划任务概述(系统任务与用户任务)

      2、系统任务配置文件描述

      3、用户任务概述

      4、crontab配置格式

      5、查看所有用户的crontab任务

      6、如何实现秒级的任务?

    1、Linux 计划任务概述(系统任务与用户任务)
    Linux的任务调度主要分为两类:

    系统任务调度:系统周期性所要执行的工作,比如系统数据备份、临时文件清理、缓存清理等。

    用户任务调度:某个用户定期要执行的工作,比如用户数据备份、定时邮件提醒等,这些工作可由每个用户自行设置。

    系统任务调度在:/etc/crontab 或在 /etc/cron.d/ 目录下载编写:

    # ll /etc/cron.d/0hourly 
    -rw-r--r-- 1 root root 128 Jan 14 00:52 /etc/cron.d/0hourly
    
    # cat /etc/cron.d/0hourly
    # Run the hourly jobs
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly

    用户任务调度:使用crontab命令来编写,写完后,存放在:/var/spool/cron/

    cron服务进程(crond是cron的守护进程)每1分钟去读取这些文件:
    【1】系统任务:/etc/crontab 文件 和 /etc/cron.d/ 目录
    【2】用户任务: /var/spool/cron/ 目录


    2、系统任务配置文件描述
    /etc/cron.d/是一个目录,也由root维护。这个目录下可以存放多个crontab任务文件,这样我们就可以以文件的粒度对不同类别的任务调度进行管理了。
    /etc/cron.d/目录下的任务调度文件需要遵循以下命名规范才能被cron服务正确扫描:
    只能包含字母、数字、下划线和中划线(尤其注意不能包含 . )
    /etc/crontab 作用与/etc/cron.d/ 一致,但一般不会在/etc/crontab文件中写。

    # cat /etc/cron.d/0hourly 
    # Run the hourly jobs
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    01 * * * * root run-parts /etc/cron.hourly        #每小时的01分钟去执行一遍:/etc/cron.hourly目录下所有的脚本
    
    # ll /etc/cron.hourly/                    #/etc/cron.hourly/ 目录下面的脚本具有可执行权限
    -rwxr-xr-x 1 root root 392 Jan 14 00:52 0anacron

    其中:通过run-parts命令来执行某个目录下的所有可执行脚本文件

    /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly 这些是什么?
    系统预设了这四个目录,用来放置【每小时、每天、每周、每月】要执行的可执行脚本文件;
    注意:这四个目录只是预设,并没有完全启用,并不是直接将可执行脚本文件放入其中就可以,还需要run-parts命令的配合。
    我所使用的centos 7.2中,就只有 /etc/cron.hourly 这一个目录作为系统样例被启用了(配置在了/etc/cron.d/目录下的 0hourly 文件中)。

    系统任务不会出现在:/var/spool/cron/ 目录中!

    通过/etc/cron.allow与/etc/cron.deny两个文件来控制哪个用户有权使用crontab。

    这两个文件的内容与格式很简单,将需要配置的用户名写入文件,每个用户名占一行。
    由于cron.allow与cron.deny同时存在的情况下,cron.deny没有实际意义。因此从逻辑、语义清晰的角度出发,不建议同时保留两个文件。根据实际需求,白名单与黑名单保留一个就好。

     

    3、用户任务概述
    用途:按照设置的时间间隔为用户反复执行某一项固定的系统任务;

    软件包: cronie/crontabs
    系统服务:crond
    日志文件:/var/log/crond    #非常重要,可用于排错

    使用crontab 命令编写:

    crontab -e [-u 用户名]    #编辑
    crontab -l [-u 用户名]    #查看
    crontab -r [-u 用户名]    #清除

    4、crontab配置格式

    分    时    日    月    周    任务命令行(绝对路径)            #需要顶格写!!!!

    分钟:从0-59之间的整数

    小时:从0-23之间的整数

    日期:从1-31之间的整数

    月份:从1-12之间的整数

    星期:0-7之间的整数,0或7代表星期日

    【*】: 匹配范围内任意时间
    【,】: 分隔多个不连续的时间点
    【-】: 指定连续时间范围
    【/n】: 指定时间频率,每n

    示例1:
    # crontab -l -u root
    * * * * * /usr/bin/date >>/root/data.txt &    # 【*】 表示匹配所有,可以理解成【每】的意思,也就是每分钟执行一下后面的命令
    
    示例2:
    30 * * * * /usr/bin/date >>/root/data.txt &     #每个小时的第30分钟执行一下后面的命令,也就是每半个小时执行一次
    
    示例3:
    30 8 * * * /usr/bin/date >>/root/data.txt &     #每天8:30分钟执行后面的命令
    
    示例4:
    30 23 * * 5 /usr/bin/date >>/root/data.txt &      #每周5晚上23:30分执行后面的命令
    
    示例5:
    30 23 1 * 5 /usr/bin/date >>/root/data.txt &     #每周五或每月1日晚上23:30 执行
    
    示例6:
    30 23 * * 1-5 /usr/bin/date >>/root/data.txt &     #每周一至周五晚上23:30执行
    
    示例7:
    30 23 * * 1,3,5 /usr/bin/date >>/root/data.txt &     #每周一、周三、周五晚上23:30执行
    
    示例8:
    0 */2 * * * /usr/bin/date >>/root/data.txt &        #每隔2个小时执行一次后面的命令
    
    
    案例:
    为用户root配置一个定时任务:
    每天在本地时间:14:23执行,需要完成的任务操作为:/bin/echo hiya
    # crontab -l -u root
    35 14 * * * /bin/echo hiya >> /root/hiya.txt

    5、查看所有用户的crontab任务

    #ls /var/spool/cron/      #该目录下存放着所有用户的crontab任务,直接cat 就可以查看用户的定时任务
    root

    6、如何实现秒级的任务?
    crontab可配置的最小的时间粒度是分钟,那么我们如何实现秒级的任务呢?有如下两种方式:

    相同的任务配置多条,通过sleep来制造执行的时间差,如每10秒执行一次:

    * * * * * command
    * * * * * sleep 10; command
    * * * * * sleep 20; command
    * * * * * sleep 30; command
    * * * * * sleep 40; command
    * * * * * sleep 50; command

    仅配置一条任务,在任务所执行的脚本内,通过for循环实现每隔n秒执行一次的逻辑,如:
    * * * * * script

    #!/bin/sh
    STEP=5
    for ((i=0; i < 60; i+=STEP))
    do
      TIME_NOW=$(date "+%Y-%m-%d %H:%M:%S")
      echo -e $TIME_NOW >> /root/scripts/logs/test.log
      sleep $STEP
    done
  • 相关阅读:
    Python装饰器理解(新手)
    vue项目随笔
    ajax 请求数据传到后台为空字符
    关于document.body.scrollTop 的谷歌,火狐浏览器兼容问题
    Nginx 反向代理解决浏览器跨域问题
    SpringBoot maven build a new demo
    UI收集
    git
    编译
    网络2
  • 原文地址:https://www.cnblogs.com/reachos/p/16356017.html
Copyright © 2020-2023  润新知