设为首页 加入收藏

TOP

Linux-crontab 定时任务配置(一)
2023-07-23 13:32:13 】 浏览:38
Tags:Linux-crontab 时任务

Linux-crontab 定时任务配置



202211021502430

介绍

crontab 是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。

  • Linux crontab 是用来定期执行程序的命令。
  • crontab 可理解为 cron_table,表示 cron 的任务列表。
  • crontab 的服务进程名为 crond,英文意为周期任务。
  • crond 每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

而 linux 任务调度的工作主要分为以下两类:

  1. 系统执行的工作: 系统周期性所要执行的工作,如备份系统数据、清理缓存
  2. 个人执行的工作: 某个用户定期要做的工作,例如每隔 10 分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置

关于crontab的用途很多,如

  • 定时系统检测;
  • 定时数据采集;
  • 定时日志备份;
  • 定时更新数据缓存;
  • 定时生成报表 ...

Tips: 新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行。


语法

crontab 是用来让使用者在固定时间或固定间隔执行程序之用,换句话说,也就是类似使用者的时程表或定时任务。

  • 用法

    crontab [-u user] file
    # Or
    crontab [ -u user ] [ -i ] { -e | -l | -r }
    
  • 参数

    -u user # 是指设定指定 user 的时程表,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表。如果不使用 -u user 的话,就是表示设定自己的时程表。
    -i      # 在删除用户的定时任务前提示 (prompt before deleting user's crontab)
    -e      # 编辑用户的定时任务列表,保存会检查任务配置是否符合规则。 (等同打开任务列表配置文件,路径 `/var/spool/cron/` 下,文件以用户名命名,如 /var/spool/cron/root)
    -l      # 列出用户的定时任务列表
    -r      # 删除用户的定时任务列表
    

规则

任务格式

验证网站: https://crontab.guru/

.--------------------- 分 minute (0 - 59)
|  .------------------ 时 hour (0 - 23)
|  |  .--------------- 日 day of month (1 - 31)
|  |  |  .------------ 月 month (1 - 12) OR jan,feb,mar,apr,may,jun,jul,aug,sept,oct,nov,dec
|  |  |  |  .--------- 周 day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
|  |  |  |  |    .---- 执行的命令或程序
|  |  |  |  |    |
*  *  *  *  *  command-to-be-executed
  • 1 列表示 “分钟” 0 - 59
  • 2 列表示 “小时” 0 - 23 (0 表示 24点)
  • 3 列表示 “日期” 1 - 31
  • 4 列表示 “月份” 1 - 12 或者用月份缩写,即 jan,feb,mar,apr,may,jun,jul,aug,sept,oct,nov,dec
  • 5 列表示 “星期” 0 - 6 (0 或 7 表示星期日) OR 或用周缩写,即 sun,mon,tue,wed,thu,fri,sat
  • 6 列是执行的 “命令或程序” (多个命令用分号 ; 隔开) 即 command1;command2

时间格式

  • * 的格式介绍:

    1. * 表示所有时间执行。
      • 如: 1 为 * 表示每分钟执行,2 为 * 表示每小时执行,以此类推
    2. n-m 表示 n 到 m 时间执行。
      • 如: 1 为 n-m 表示从第 n 到第 m 分钟执行,2 为 n-m 表示从第 n 到第 m 小时执行,以此类推
    3. a, b, c,... 表示第 a, b, c,... 时刻执行。
      • 如: 1 为 a, b, c 表示第 a, b, c...个分钟要执行,2 为 a, b, c 表示第 a, b, c...个小时要执行,以此类推
    4. */n 表示每 n 时间间隔执行一次。
      • 如: 1 为 */n 表示每 n 分钟个时间间隔执行一次,2 为 */n 表示每 n 小时个时间间隔执行一次,以此类推
  • Crontab 范例

    格式 执行时间
    * * * * * 每分钟执行
    */10 * * * * 每10分钟执行
    0 * * * * 每小时执行
    0 0 * * * 每天执行
    0 0 * * 0 每周执行
    0 0 1 * * 每月执行
    0 0 L * * 每月底执行
    0 0 1 1 * 每年执行

如果不确定书写的定时任务是否符合需求,可以去此地址进行验证:

https://crontab.guru/


特殊符号 %

% 在 crontab 是特殊符号,第一个 % 表示 标准输入(STDIN) 的开始,其他 % 用于表示crontab条目中的一个新行。

% 例子

  • 例1,一个 %

    * * * * * cat >> /tmp/cat.txt 2>&1 % stdin input

    输出如下

    $ cat /tmp/cat.txt
    stdin input
    

    Tips: cat >> /tmp/cat.txt 作用是将标准输入重定向至/tmp/cat.txt。

  • 例2,多个 %

    * * * * * cat >> /tmp/cat_line.txt 2>&1 % stdin input 1 % stdin input 2 % stdin input 3

    第一个 % 为标准输入开始,后面的 % 相当于换行符,故输出如下

    $ cat /tmp/cat_line.txt
    stdin input 1
    stdin input 2
    stdin input 3
    

% 使用

如何将 crontab 行中的%作为 % 而不是作为新行使用?

  1. 转义 %

    * * * * * cat >> /tmp/cat_special.txt 2>&1 % per cent is \%. 2>&1

    输出如下

    $ cat /tmp/cat_special.txt
    per cent is %.
    
  2. shell脚本

    将命令写入 shell脚本,然后 cron 执行 shell脚本即可避免 % 问题,shell脚本格式如下

    #/bin/sh
    
    command
    
  3. 通过 sed 传递文本

    * * * * echo '% another \% minute \% has \% passed'| sed -e 's|\\|| g'

    输出如下

    % another % minute % has % passed
    

    常用场景:

    在crontab中使用MySQL命令时,这种技术非常有用。MySQL命令中经常出现 %,如下
    
    SET @monyy=DATE_FORMAT(NOW(),"%M %Y")
    SELECT * FROM table WHERE name LIKE 'fred%'
    
    因此,要有一个crontab条目来运行MySQL命令
    
    mysql -vv -e "SELECT * FROM table WHERE name LIKE 'Fred%'" member_list
    
    将必须在crontab中显示为
    
    echo "SELECT * FROM table WHERE name LIKE 'Fred\%'" | sed -e 's|\||g' | mysql -vv member_list
    
    把crontab的拆开如下:
    
    1. echo 命令将 MySQL命令发送到 STDOUT
    2. sed 在将输出发送到 STDOUT 之前删除了任何 反斜杠(\)
    3.
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇关于使用docker volume挂载的注意.. 下一篇Dockerfile创建apache镜像(alpin..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目