zoukankan      html  css  js  c++  java
  • Linux定时任务

    定时任务简介

    什么是定时任务

    maintains crontab files for individual users 为单一用户维护crontab文件

    为什么要使用定时任务

    使用计划任务可以周期性的执行一些命令、脚本等,比如批量服务、备份脚本

    Linux系统的定时任务分类

    1、linux系统自身定期执行的任务工作:轮询系统日志、备份系统数据、清理系统缓存等,这些人物无需我们任务干预

    此部分定时任务位置:

    [root@localhost ~]# ll /etc/cron.d/
    total 4
    -rw-r--r--. 1 root root 128 Aug  3  2017 0hourly
    [root@localhost ~]# 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

    2、用户自定义的定时任务 :如定时备份系统文件、数据库数据备份、同步系统时钟

    定时任务的规范

    1、定时任务的格式定义

    # cat /etc/crontab 
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    
    # For details see man 4 crontabs
    
    # Example of job definition:
    # .---------------- minute (0 - 59)               # 分钟,取值范围从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  # 每秒执行用户定义的命令

    另外:

    - :代表时间范围,如: 1-5 * * * * 表示每小时的前5分钟

    * :代表任意时间、每(per)

    ,:代表时间点   如: * * * * 1,4,0 表示每周一、周四、周日

    /num :表示时间间隔   如:*/5 * * * * 表示每隔5分钟执行

    2、定时任务的示例

    00 02 * * * ls      #每天的凌晨2点整执行
    00 02 1 * * ls      #每月的1日的凌晨2点整执行
    00 02 14 2 * ls     #每年的2月14日凌晨2点执行
    00 02 * * 7 ls      #每周天的凌晨2点整执行
    00 02 * 6 5 ls      #每年的6月周五凌晨2点执行
    00 02 14 * 7 ls     #每月14日或每周日的凌晨2点都执行
    00 02 14 2 7 ls     #每年的2月14日或每年2月的周天的凌晨2点执行   
    */10  02 * * * ls   #每天凌晨2点,每隔10分钟执行一次
    * * * * *  ls       #每分钟都执行
    00 00 14 2 *  ls    #每年2月14日的凌晨执行命令 
    */5 * * * *  ls     #每隔5分钟执行一次
    00 02 * 1,5,8 * ls  #每年的1月5月8月凌晨2点执行
    00 02 1-8 * *  ls    #每月1号到8号凌晨2点执行
    0 21 * * * ls       #每天晚上21:00执行
    45 4 1,10,22 * * ls #每月1、10、22日的4:45执行
    45 4 1-10 * * l     #每月1到10日的4:45执行
    3,15 8-11 */2 * * ls #每隔两天的上午8点到11点的第3和第15分钟执行
    0 23-7/1 * * * ls   #晚上11点到早上7点之间,每隔一小时执行
    15 21 * * 1-5 ls    #周一到周五每天晚上21:15执行

    定时任务的配置文件位置

    每个用户的定时任务位于:/var/spool/cron/USERNAME,当使用crontab -e选项时,就相当于编辑此文件

    [root@localhost ~]# ll /var/spool/cron/
    total 8
    -rw------- 1 root root 35 Jun  5 00:42 root
    -rw------- 1 root root 35 Jun  5 00:50 test

    crond的全局配置文件

    [root@localhost ~]# ll /etc/cron* -d
    drwxr-xr-x. 2 root root  21 Dec 16  2018 /etc/cron.d
    drwxr-xr-x. 2 root root  42 Dec 16  2018 /etc/cron.daily          # 每天执行一次的job
    -rw-------. 1 root root   0 Aug  3  2017 /etc/cron.deny           # 限制用户使用crontab
    drwxr-xr-x. 2 root root  22 Dec 16  2018 /etc/cron.hourly         # 每小时执行一次的job
    drwxr-xr-x. 2 root root   6 Jun  9  2014 /etc/cron.monthly        # 每月执行一次的job
    -rw-r--r--. 1 root root 451 Jun  9  2014 /etc/crontab
    drwxr-xr-x. 2 root root   6 Jun  9  2014 /etc/cron.weekly         # 每周执行一次的job

    crontab命令的使用

    1、crontab命令的语法

    crontab [-u user] file
    crontab [-u user] [-l | -r | -e] [-i] [-s]
    crontab -n [ hostname ]
    crontab -c

    2、常用选项

    选项 描述
    -e 编辑、修改当前用户的定时任务
    -l 查看当前用户的定时任务
    -r 删除当前用户的定时任务
    -i 与-r合用,删除之前交互式提示
    -u 指定用户

    3、设置定时任务

    检查服务是否启动,如果未启动需要安装

    [root@localhost ~]# ps -ef|grep cron|grep -v grep
    root        508      1  0 Jun04 ?        00:00:00 /usr/sbin/crond -n
    • 使用-e选项设置
    # crontab -e
    * * * * *  /usr/bin/echo 1 >> /root/a.txt
    • 从已有文件进行设置(如果之前设置过定时任务,会覆盖
    # vim echo_cron
    * * * * *  /usr/bin/echo 1 >>c.txt
    
    # crontab echo_cron
    
    # crontab -l
    * * * * *  /usr/bin/echo 1 >>c.txt
    • 为指定用户设置定时任务(默认设置的是当前用户)
    [root@localhost ~]# useradd test
    
    [root@localhost ~]# crontab -e -u test
    * * * * *  /usr/bin/echo 1 >>c.txt
    
    或者
    [root@localhost
    ~]# crontab -u test echo_cron

    4、设置某用户无法使用crontab

    # echo "test" >> /etc/cron.deny 
    
    [root@localhost ~]# su - test
    Last login: Sat Jun  5 00:51:10 EDT 2021 on pts/0
    
    [test@localhost ~]$ crontab -e
    You (test) are not allowed to use this program (crontab)
    See crontab(1) for more information
    
    [test@localhost ~]$ crontab -l
    You (test) are not allowed to use this program (crontab)
    See crontab(1) for more information

    注意,此功能是限制该用户无法使用crontab命令进行设置,有使用-u权限的用户仍可以为该用户设置定时任务

    # crontab -e -u test
    * * * * *  /usr/bin/echo 1 >>c.txt
    * * * * *  /usr/bin/echo 22 >>d.txt
    
    [root@localhost ~]# ll /home/test/
    total 8
    -rw-r--r-- 1 test test 44 Jun  5 01:12 c.txt
    -rw-r--r-- 1 test test  3 Jun  5 01:12 d.txt

    5、备份crontab

    1、备份/var/spool/cron/{username}

    2、通过/var/log/cron中的记录,推算任务执行时间(亲身经历某银行-r选项被开发使用,导致跑批定时任务清空,而且没有备份,只能分析文件)

    使用crond的注意事项

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

    2、定时任务脚本中的程序命令及路径尽量用绝对路径

    3、使用命令执行定时任务时,一定要用命令的绝对路径,最好使用脚本代替命令行定时任务

    4、运行脚本一定要用/bin/sh

    5、定时任务中命令或脚本的结果(正确和错误的)重定向到/dev/null或追加到文件中,如果没有定向到文件或者定向到黑洞中(/dev/null)时间久了就会出现NO SPACE of device那个错误 inode满了

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

    7、注意有些命令是无法成功执行的 echo "123" >>/tmp/test.log &>/dev/null

    crond的使用常见问题

    1、定时任务的输出结果没有定向到空或文件,没有开邮件服务导致产生大量小文件,系统inode被占满

    解决办法:

    删除/var/spool/postfix/maildrop/下的小文件

    如果定时任务结果没重定向到文件或者/dev/null,而开启了右键服务,会给root用户发邮件

    2、时间变量的反斜线问题

    “%”在crontab任务配置中被认为是newline,需要用“”来转义。crontab任务命令中,如果有date +%F-%T 必须替换为:date +\%F-\%T,是写在脚本中就不需要转义了。

  • 相关阅读:
    部署方法
    MIME
    设置下载文件位置
    访问端口
    什么是Linq表达式?什么是Lambda表达式?
    彻底理解js中this的指向,不必硬背。
    获取checkbox状态
    checkbox复选框,如何让其勾选时触发一个事件,取消勾选时不触发
    leetcode — reverse-nodes-in-k-group
    leetcode — swap-nodes-in-pairs
  • 原文地址:https://www.cnblogs.com/zh-dream/p/14852600.html
Copyright © 2011-2022 走看看