周期性计划任务Cron详解

概述


cron 是Linux 或者类 Unix 系统的作业调度程序。利用它,我们可以配置某些命令或者脚本,让命令和脚本在某个设定的时间内周期性地运行。本文主要以描述了 CentOS 6的cron命令的详细知识。

了解cron组件


cron程序由程序包cronie提供,我们可以通过rpm -qi cronie查看cronie的信息。

wKiom1fdDJCRnDB4AABednY8Wbo104.png

cron 的组件包括:

1.守护进程本身(crond);

    所谓守护进程,即是不间断运行在后台的进程,它随时监听用户的请求,并随时响应并予以执行用户的作业。crond的最小周期单位是1分钟/次。

2. 一个用来添加、修改和删除用户配置文件的实用程序;

    cron程序主要通过 crontab 命令 管理cron作业。一般来说,cron 配置文件或 cron 作业的列表被称为 crontab 或 cron 时间表。为了避免混淆,本文将命令和作业分别以 crontab 命令 和crontab 作以区分。

    虽然我们可以直接编辑配置文件,但限于crontab有固定格式,所以不建议用文本编辑器进行直接编辑。而应该使用 crontab 命令进行管理计划任务。

 

3. 一组系统范围的配置文件;

    我们可以在三个位置定义与系统相关的 crontab 作业:/etc/crontab、/etc/cron.d 中的任何文件以及特殊目录 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly。

  • 主要的系统crontab是/etc/crontab。这个文件有独特的语法(在下一节中讨论),其中定义的每个作业根据它自己的时间表(比如每小时两次或每天一次)作为指定的用户运行。使用 /etc/crontab 调度各种管理和维护任务。


  • 可以在 /etc/cron.d 目录中维护一组 crontab。通过创建crontab,按照逻辑对属于某一子系统的命令进行分组。/etc/cron.d
    中的文件采用与 /etc/crontab 相同的语法,每个作业按照自己的时间表并作为特定的用户运行。

  • 还可以把 shell 脚本直接放在
    /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 或 /etc/cron.monthly
    目录中,实现每小时、每天、每周或每月运行此脚本一次。放在这里的脚本作为超级用户运行。

4. 一组针对特定用户的配置文件;

    针对用户的 crontab 集合通常放在 /var/spool/cron/ 中,通常以用户名做为文件名存放。同样的,建议使用 crontab命令 创建
crontab 并提交文件。   

5. 一个简单的访问控制设施。

    分别使用访问控制文件 /etc/cron.allow 和 /etc/cron.deny 允许或拒绝用户访问 cron。例如,如果某个用户的作业可能会破坏系统的正常操作,就可以拒绝他访问 cron。

crontab作业


crontab 是一个文本文件。它可以包含四种代码行:空行、注释、环境变量设置和作业命令。

wKiom1fdO1viUPDDAAA-Rzf0Upc401.png

空行和注释

文件中的空行和多余的空格被忽略。空行和空格有助于提高 crontab 的可读性,使 crontab 组织有序。

还可以使用注释对每个作业的时间表和用途加以说明。要想创建注释,只需在一行的开头加上一个井号(#)。

环境变量设置

cron 最终使用一个 shell 执行每个命令。可以通过环境变量修改或定制 shell 的行为。

在 crontab 中很容易设置 shell 环境变量。只需输入 VARIABLE=value,把 VARIABLE 替换为变量名,把 value 替换为一个值。

cron 预定义了4个环境变量:

    • PATH 的默认值是 /sbin:/bin:/usr/sbin:/usr/bin。

    • SHELL 预设置为 /bin/bash。

    • HOME 设置为 crontab 所有者的主目录,比如 /home/joe。

    • MAILTO 执行结果邮件发送给MAILTO指定的用户。

要想修改这些默认值或设置任何变量,只需在 crontab 中设置适当的环境变量。

注意:crontab的任务环境PATH与用户登录的PATH很多时候不完全相同,所以编写crontab执行命令或脚本时,建议使用命令的绝对路径;也可以修改crontab的PATH变量。

作业命令

crontab的作业命令由单行固定格式的文本构成。一般可以分为3个部分:

wKiom1fd7x7AVhufAACRHSLxtBw909.png

  1. 执行频率,定义周期性时间;以空格分隔的5个字段,分别代表:分钟,小时,日期,月份,周。

  2. crontab所有者,运行任务的用户身份;系统级crontab必须有此字段,用户级(/var/spool/cron/*)的crontab则无需此字段。因此,是否有用户名是系统 crontab 和用户 crontab 之间的惟一差异。

  3. 执行命令或脚本。

crontab执行频率支持多种设置,可以灵活的允许以多种方式运行作业,比如每分钟或在特定日期的特定时间。

表1. cron 作业执行频率选项
位置 字段 说明
1 分钟
0-59
2 小时 0-23 0到23的24小时计时法
3 日期 1-31 与分和小时不同,月中日不是从0开始的。
4 月份 1-12 月份也不是从0开始的。也可以使用月份英文名的前三个字母,比如 jan 或 may。
5 0-7

0和7 都代表星期日。还可以使用英文名称的前三个字母,比如 sun、mon、tue…

注意

          A.一般定义了具体的月和日后,不建议定义周,例如:* * 1 2 3,表示2月1日并且是周3的每分钟,符合条件的那一天也许百年不遇;

          B.定义了具体日期和周,则是或关系,例如:* * 1 * 3,表示每个月的1日或者每个月的周三

表2. crontab每个时间字段表示法:

序号 说明
1 N 特定值,给定时间点邮箱取值范围内的值。(N表示数字)
2 * 给定时间点上有效取值范围内的所有值,表示为“每…”
3 离散取值
4 连续取值
5 / 在指定时间范围上,定义步长

我们通过以下示例说明周期表示法:

表3. 示例说明

小时 日期 月份 说明
* * * * * 每分钟执行
0 1 15 1,3,5,7,9,11 * 在 1、3、5、7、9 和 11 月的 15 日的 1 a.m.  运行命令。在指定列表时,不要在逗号后面加空格。
0-59/15 * * * * 每  15 分钟运行命令一次。0-59/15等同于*/15
30 * * * wed,fri 星期三和星期五每小时的 30  分时执行命令一次。(在列表中可以使用日和月份的名称,但是在范围中不可以)。
0,30 0-5,17-23 * * * 在(0点-5点,  以及 17点-23点之间)整点时和 30 分时运行命令。
0 0 1 1 * 在每年 1 月 1 日0:00执行命令一次。
0 0 * * 0 在每个星期日午夜运行命令。这相当于每周一次。
30 0 10,20,30 * 6 每星期六和每月的 10、20 和 30 日(二月除外)的 00:30  运行命令。

前面提到crond的最小周期单位是1分钟/次。如果我们需要运行的周期是以秒或更小单位时候,要怎么办呢?

这里建议方法是:以脚本编写执行命令,通过循环语句,配合sleep、usleep,达到秒级甚至微秒的周期性任务任务。

crontab命令


crontab命令本质上是调用文本编辑器进行编辑 crontab ,并在修改保存时进行语法格式检查。

crontab的语法格式

crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]

crontab的常用选项

    -e    编辑用户的 crontab;
    -l    列出用户的 crontab;
    -r    删除用户的 crontab;

crontab命令使用受权限控制。

crontab权限管理


cront通过/etc/cront.{allow,deny}两个文件,进行权限管理,控制用户是否能执行cront任务:

  1. /etc/cront.allow 存在,则/etc/cront.deny不生效,只有文件定义的使用者才能使用 crontab 命令 ,没有在这个文件中的使用者则不能使用,即使没有写在cront.deny 当中;

  2. /etc/cront.allow 不存在, /etc/cront.deny 生效, cront.deny文件定义的使用者不能使用 cront ,而没有在这个 cront.deny 文件中的使用者则可使用 crontab 命令

  3. 如果两个文件都不存在,只有 root 可以使用 crontab 命令

白名单优先管理权限,默认没有/etc/cron.allow文件,只要创建,仅列出的允许,其他都拒绝

原创文章,作者:昭其,如若转载,请注明出处:http://www.178linux.com/47423

(4)
上一篇 2016-09-18 12:26
下一篇 2016-09-18 13:37

相关推荐

  • 定时任务应用示例

    定时任务应用示例 1.每4小时执行一次对/etc目录的备份,备份至/backup目录中,保存的目录名为形如etc-201504020202 mkdir /backup crontab -e * */4 * * * cp -ar /etc/ /backup/etc-$(date +%Y%m%d%H%M) 2.每周2,4,6备份/var/log/messages…

    Linux干货 2017-08-06
  • 设计模式(六)桥连模式Bridge(结构型)

    1. 概述       在软件系统中,某些类型由于自身的逻辑,它具有两个或多个维度的变化,那么如何应对这种“多维度的变化”?如何利用面向对象的技术来使得该类型能够轻松的沿着多个方向进行变化,而又不引入额外的复杂度? 例子1:设想如果要绘制矩形、圆形、椭圆、正方形,我们至少需要4个形状类,但是如果绘制的图形需要具有不同的…

    Linux干货 2015-06-26
  • PXE自动化安装系统服务

    PXE PXE(preboot execute environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或M…

    Linux干货 2016-11-07
  • python 多版本管理(pyenv)

    01 – Python 简介和安装 01 – Python 简介和安装 1. Python 简介 2. 安装 pyenv 3. pyenv 使用 4. pyenv-virtualenv 5. 安装 IPython 和 Jupyter 01 – Python 简介和安装 1. Python 简介 编程风格 面向过程:以指令为…

    Linux干货 2016-07-10
  • nginx 基础笔记

    一、Nginx 优点 高性能web,可以支持反向代理 比Apache性能优越,支持更多的并发连接,但资源占用很少,轻量级的web服务器。可以支持高达50000个并发连接数的响应 Nginx 在Linux 2.6+ 使用epoll模型,提供卓越性能 做为负载均衡服务器,可以在内部直接支持PHP和Rails,也可以支持作为HTTP代理服务器对外进行服务 Ngin…

    Linux干货 2016-03-19
  • Centos网卡bond

    Centos6_Bonding配置: 1.禁用NetworkManager服务  2.创建bonding设备的配置文件 3.添加从属接口1 4.添加从属接口2 5.重启网卡服务 6.查看bond0状态 7.删除bond配置 Centos7_Bonding配置: 1.添加bonding接口 2.添加从属接口1 3.添加从属接口2 4.修改bondin…

    2017-05-17

评论列表(1条)

  • 马哥教育
    马哥教育 2016-09-20 12:27

    写的很详细,特别时间格式,很多时候,定时计划任务出错就是时间定义出错。