Linux定时任务概述

基于centos7.6.1810

参考鸟哥私房菜

/etc/crontab

[root@VM-4-10-centos ~]# 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)
# |  .------------- 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
  • 可以看到/etc/crontab说明了一个定时任务的定义模板

  • 7个字段,前面5位是时间字段,第六位是用吗,第七位是待执行的命令

  • 时间说明

    第N位 单位 范围 说明
    第一位 分钟 0-59
    第二位 小时 0-23
    第三位 几号 1-31
    第四位 哪一月 1-12 可以是jan,feb,mar,apr等英文缩写
    第五位 周几 0-7 周日是0或7,也可以是sun,mon,tue等英文缩写
  • 每一位上均可以是特殊字符,比如

    特殊字符
    * 代表任何时刻都接受的意思
    , 代表分隔时段的意思
    - 代表一段时间范围内
    /n 每隔 n 单位间隔
  • 示例

      30  21  *  *  1,3,5,7    umount /media
      # 每周一、周三、周五、周日的晚上9点半执行umount /media
      *  8-23/2  *  1-5  *  /apps/bin/dbcheck.sh
      # 每年的1到5月早上8点到23点间每隔2个小时(8:00-10:00-12:00这样)执行数据库检查脚本
      0  0  *  *  2-6 /apps/bin/dbcheck.sh
      # 周二到周六早上0点执行数据库检查脚本
      45  4-8  1,10,22  *  *  exp scott/tiger dbfile=1.bak
      # 每个月的1号、10号、22号的早上4点到8点的45分(4:45-5:45) 执行后续命令
      10  1  *  *  6,0   /usr/local/alert/file_check.sh
      # 每个周末的凌晨1点10分执行文件检查脚本
      59  23  28  2-5,7,9  *   /usr/local/alert/file_check.sh
      # 每年的2、3、4、5、7、9月的28日晚上23点59分执行文件检查脚本
    
  • 注意这样写的含义

    * 1-23 * * *  # 每天的1:00 1:01 1:02 ... 都会去...
    0 1-23 * * *  # 每天的1:00 2:00 3:00 ... 都会去 ...
    

crontab命令

  • 知道了如何去定义一个定时任务

  • 你还需要知道如何去编辑查看删除定时任务等,你会用到crontab这个命令

  • crontab命令常见参数

    -e  #edit   编辑,进入vi模式了,写完保存退出即可
    -l  #list   列出所有定时任务
    -r  #remove  删除指定的定时任务
    
  • 一行一个定时任务

配置文件

  • /etc/cron.allow: 将可以使用 crontab 的帐号写入其中,若不在这个文件内的使用者则不可使用 crontab

  • /etc/cron.deny: 将不可以使用 crontab 的帐号写入其中,若未记录到这个文件当中的使 用者,就可以使用 crontab

  • 以优先顺序来说, /etc/cron.allow 比 /etc/cron.deny 要优先, 而判断 上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可。系统默认是保留 /etc/cron.deny

  • 一个账号一行

  • cron定时任务的执行还依赖于crond进程,你可以用systemctl来管理它

    [root@VM-4-10-centos home]# ps -ef|grep crond
    root      9612     1  0 13:37 ?        00:00:00 /usr/sbin/crond -n
    
    [root@VM-4-10-centos home]# systemctl status crond
    ● crond.service - Command Scheduler
       Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
       Active: active (running) since Tue 2023-02-28 13:37:26 CST; 9min ago
     Main PID: 9612 (crond)
        Tasks: 1
       Memory: 620.0K
       CGroup: /system.slice/crond.service
               └─9612 /usr/sbin/crond -n
    
    

关于定时任务的其他

工具网站

https://tool.lu/crontab/

https://crontab.guru/

冲突

  • 仔细的同学会发现如果我设置的几月几日,且设置了周几,那到底以哪个为准呢?

    1 2 3 4 5 root echo haha # 每年的4月3日 一定是周五?
    
  • man 5 crontab往下翻一点,你能找到这段话

     Note: The day of a command's execution can be specified in the following two fields — 'day of month', and  'day  of  week'.   If  both  fields  are restricted (i.e., do not contain the "*" character), the command will be run when either field matches the current time.  For example,
           "30 4 1,15 * 5" would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
    
    
  • 前面的5个时间字段,其实分为2个部分,前面4个是一部分,后面周几是另外一部分。

  • 这是or的关系,意味着满足一个就会去执行,所以

    1 2 3 4 5 root echo haha 
    # 这个命令的意思是每周五的凌晨2点1分,root用户“哈哈”,
    # 以及每年的4月3日凌晨2点1分root用户也会“哈哈”