Linux之crontab定时任务

2019/12/03

一、概述

      crontab是一个命令,常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。系统默认会安装此服务,并且会自动启动crond进程, crond进程 每分钟 会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

  • cron是服务名称
  • crond是后台进程
  • crontab是计划任务表

二、任务分类

1、系统任务调度

系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件,内容如下:

在这里插入图片描述

第一行SHELL变量指定了系统要使用哪个shell,这里是bash;

第二行PATH变量指定了系统执行命令的路径;

第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;

第四行之后是使用介绍

2、用户任务调度

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用crontab来定制自己的计划任务。所有用户定义的crontab文件都被保存在/var/spool/cron目录下,其文件名与用户名一致。

 

三、用法

1. 基本命令

  • crontab file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • crontab [-u user] -e:编辑某个用户的crontab文件内容。默认表示编辑当前用户的crontab文件内容。
  • crontab [-u user] -l:显示某个用户的crontab文件内容。默认显示当前用户的crontab文件内容。
  • crontab [-u user] -[i]r:从/var/spool/cron目录中删除某个用户的crontab文件,默认删除当前用户的crontab文件。-i参数指定在删除用户的crontab文件时是否给确认提示。

上述命令可以使用 -u user 指定某个用户的crontab服务,一般是像root这种高权限用户使用。

2. crontab内容格式

  • 用户所建立的crontab文件中,每一行都代表一项任务,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,含义和取值见上图使用介绍。

注:command 是执行文件,要赋予可以执行权限,并且可执行文件要写绝对路径。最好重定向日志。

  • 特殊字符:
    • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作;
    • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”;
    • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”;
    • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
  • 使用示例:

每周末,凌晨1-5点,每隔10分钟执行一次auto-del-log.sh,日志输出到auto.log

*/10 1-5 * * 6,7 cd /data/prod/kafka_connect_tongji/logs; ./auto-del-log.sh >> auto.log 2>&1

1表示标准输出,stdout。 2表示标准错误,stderr。 2>&1 的意思就是将标准错误重定向到标准输出

linux中>表示覆盖原文件内容,»表示追加内容。

3. 使用技巧

秒级定时任务

crontab最小时间单位是分,如果需要在秒级设置定时任务,可以有两种方式使用sleep实现

  • 多个定时任务实现每隔十秒执行一次

在这里插入图片描述

test.sh内容如下:

  #!/bin/bash
  
  echo "hello cron"
  echo $(date "+%Y-%m-%d %H:%M:%S")

输出:

在这里插入图片描述

  • 脚本实现每隔2秒执行一次

在这里插入图片描述

testCrontab.sh内容如下

    #!/bin/bash  
    
    echo $(date)
    
    step=2 #间隔的秒数,不能大于60  
      
    for (( i = 0; i < 60; i=(i+step) )); do  
        echo "hello corntab"
        echo $(date "+%Y-%m-%d %H:%M:%S")
        sleep $step  
    done  
      
    exit 0

输出:

在这里插入图片描述

如果日志输出没有权限,需要给文件赋可执行权限

在这里插入图片描述

在这里插入图片描述

4. crond服务操作命令

  • /sbin/service crond start          启动服务
  • /sbin/service crond stop          关闭服务  
  • /sbin/service crond restart       重启服务  
  • /sbin/service crond reload       重新载入配置
  • /sbin/service crond status       服务是否运行

5. 高级使用

查看使用者权限文件:一般root用户使用

/etc/cron.deny 该文件中所列用户不允许使用crontab命令

/etc/cron.allow 该文件中所列用户允许使用crontab命令

Post Directory