在linux上按期执行命令、脚本(cron,crontab,anacron)

人类把时间作了切割,想象一条笔直的线永远向前,原本这条直线上什么都没有,可是人类根据时间的长短(单位)在这条直线上作了密密麻麻的标记(世纪-年-月-日-时-分-秒-豪秒......),经过这样的方式历史上的每个时刻都可以被单独拿出来,而将来的每个时刻也能被单独计划。更重要的是,每个单独的时刻又能跟相邻的被更大单位所控制的类似时刻作比较,好比,今天的晚上12点跟明天的晚上12点,类似的是,两个时刻都是12点,不一样的是今天跟明天,她们是相邻的更大单位。由于这样的缘故,在被更大单位所隔开的每个相同时刻,咱们能够告诉计算机重复某个任务。linux

在linux下,若是想要在将来的某个时刻执行某个任务,而且在将来的每个这样的时刻里都要执行这个任务,举个简单的例子,好比说想要在未来,天天的十二点都重启路由器,大多数发行版都自带一个守护进程(daemon)cron来完成这项工做。git

1.cron,crontab以及anacron的关系

cron是大多数linux发行版都自带的守护进程(daemon),用来重复运行某些被设定好了肯定的运行时间的任务,这些任务能够是每月运行、每周运行、天天运行,甚至是每一分钟运行。用cron执行的任务适合于24小时运行的机器,cron执行的任务会在设定好的时刻执行,当机器处于关机状态下并错过了任务执行的时间,cron任务就没法预期执行了。github

crontab(cron table的简称)既能够指cron用来按期执行特定任务所须要的列表文件,又能够指用来建立、删除、查看当前用户(或者指定用户)的crontab文件的命令。shell

anacron不是守护进程,能够看作是cron守护进程的某种补充程序,anacron是独立的linux程序,被cron守护进程或者其余开机脚本启动运行,能够天天、每周、每月周期性地执行一项任务(最小单位为天)。适合于可能常常会关机的机器,当机器从新开机anacron程序启动以后,anacron会检查anacron任务是否在合适的周期执行了,若是未执行则在anacron设定好的延迟时间以后只执行一次任务,而无论任务错过了几回周期。举个例子,好比你设定了一个每周备份文件的任务,可是你的电脑由于你外出度假而处于关机状态四周,当你回到家中开机后,anacron会在延迟必定时间以后只备份一次文件。因为发行版的不一样,cron守护进程如何运行anacron会有所不一样。vim

2.crontab命令,crontab文件语法

系统默认crontab文件为/etc/crontab,以及/etc/cron.d/目录下的文件,有些程序会把本身的crontab文件放在/etc/cron.d/目录下。要修改/etc/crontab以及/etc/cron.d/目录下的文件须要root权限。cron守护进程会检查/etc/crontab以及/etc/cron.d/目录下的文件,根据这些文件中的cron任务所设置的执行时间决定是否执行任务,若是当前时间与cron任务所设置的执行时间相同,则执行任务。centos

每一个用户本身的crontab文件都会被放在 /var/spool/cron目录下,默认为空,可使用crontab命令建立。cron守护进程会检查/var/spool/cron目录下的文件,根据这些文件中的cron任务所设置的执行时间决定是否执行任务,若是当前时间与cron任务所设置的执行时间相同,则执行任务。bash

当cron的配置文件发生改变时,不须要重置cron守护进程。cron守护进程会检查配置文件的变化。dom

建立本身的crontab以前,首先要设置环境变量EDITOR,cron进程根据它来肯定使用哪一个编辑器编辑crontab文件。在home目录下的.bashrc或者.profile里加入一行编辑器

#你也可使用本身喜好的其余终端编辑器
EDITOR=vim; export EDITOR

复制代码

2.1.crontab命令参数及使用示例

usage:	crontab [-u user] file
	crontab [ -u user ] [ -i ] { -e | -l | -r }
	-e	(edit user's crontab) -l (list user's crontab)
	-r	(delete user's crontab) -i (prompt before deleting user's crontab)
复制代码

建立并编辑当前用户的crontabide

crontab -e
复制代码

列出当前用户的crontab

crontab -l
复制代码

删除用户linus的crontab

crontab -u linus -i -r
复制代码

2.2.crontab文件语法详解及示例

当用crontab -e编辑当前用户的crontab文件时,首先写入如下内容。

# crontab -e
SHELL=/bin/bash
MAILTO=root@example.com
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

# 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

复制代码

该文件的前三行代码设置了默认环境。cron守护进程并不提供任何环境。SHELL变量设置当cron任务(命令以及脚本)运行时的shell,MAILTO变量设置cron任务执行结果发送的邮箱,PATH设置去哪些目录下寻找cron任务的命令。注释部分则解释一条cron任务的构成,一条cron任务就是一行,要设置多少条cron任务则写多少行。一条cron任务由七个部分组成,从左到右依次为:

  • 分钟(0-59)
  • 小时(0-23)
  • 天(1-31)
  • 月 (1-12):或者可使用月份的英文单词的前三个字母,好比jan,feb,mar,apr...
  • 星期(0-6):星期天用0或者7均可以,或者可使用星期的英文单词的前三个字母,好比sun,mon,tue,wed,thu,fri,sat
  • 用户名称(能够省略)
  • 要执行的命令或者脚本目录

前五个部分的编写注意特殊符号的含义:

  • 若是你想匹配取值范围内的全部值,使用“*”
  • 想匹配某些特殊的值,使用“,”,好比2,4,7就匹配的是2,4以及7。
  • 两个值被“-”链接表示范围,此时匹配的是范围内全部值,包含“-”两边的值,好比4-7匹配的就是从4到7。
  • 想要表达每隔一段时间执行一次任务,使用 “/”, 好比分钟部分中的 “*/10”表示每10分钟运行一次,好比小时部分中的“10-22/2”则表示在早上10点到晚上10点这段时间内,每隔两个小时运行一次。 注意:当“/”左边的值能够除尽“/”右边的值时,任务才会运行。

例子1: 天天凌晨执行

0 0 * * * root command
复制代码

例子2: 每周星期天早上五点执行

0 5 * * sun root command
复制代码

例子3: 每月的前10天晚上10点开始每隔10分钟执行一次命令

*/10 22 1-10 * * root command
复制代码

例子4: 从星期一到五,每一个小时的第10分钟、第20分钟以及第30分钟都执行一次命令

10,20,30 * * * 1-5 root command
复制代码

例子5: 从早上10点到晚上10点,每一个偶数的小时(好比10点,12点)里每五分钟运行一次命令

*/5 10-22/2 * * * root command
复制代码

特殊简便写法:

@hourly 表明0 * * * *,每一个小时运行一次

@daily 表明0 0 * * * ,天天凌晨运行一次

@weekly 表明0 0 * * 0,每周星期天凌晨运行一次

@monthly 表明0 0 1 * *,每月第一天凌晨运行一次

@yearly 表明0 0 1 1 *,每一年的头一分钟运行一次

@reboot 重启后执行一次

例子: 天天凌晨运行一次 @daily command 你能够把须要每一个小时运行一次的脚本放到/etc/cron.hourly目录下,cron守护进程会每一个小时都运行一次。

2.3.限制可使用cron的用户

在/etc/目录下,可能默认会有cron.allow以及cron.deny文件,也可能没有,没有的状况下能够本身建立,cron.allow文件包含了可使用cron的用户名,cron.deny文件包含了不可使用cron的用户名。两个文件中每一个用户名占一行,而且不容许出现空格。 root用户在任何状况下均可以使用cron。 假如cron.allow存在,则只有列在这个文件中的用户名可使用cron,这时候cron.deny被忽视。 假如cron.allow不存在,则列在cron.deny文件中的用户名不可使用cron。

3.用anacron执行周期性的任务

anacron程序能够周期性的执行任务,但具体执行时间并不肯定。能够天天、每周、每月周期性的执行任务。当anacron的配置文件发生改变时,下一次anacron运行时会检查到配置文件的变化。anacron的配置文件为/etc/anacrontab,编辑须要root权限,默认如下内容:

# See anacron(8) and anacrontab(5) for details.

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22

#period in days delay in minutes job-identifier command
1       5       cron.daily              nice run-parts /etc/cron.daily
7       25      cron.weekly             nice run-parts /etc/cron.weekly
@monthly 45     cron.monthly            nice run-parts /etc/cron.monthly
复制代码

能够看到前三行设置了默认环境,RANDOM_DELAY变量设置了最大延迟执行时间,START_HOURS_RANGE变量设置了anacron任务执行的时间范围,默认在天天的3点到22点之间。最后三行则设置了三条默认的anacron任务,分别是天天执行,每周执行,每个月执行。

3.1.anacron文件语法

观察前面三条默认的anacron任务,能够看到一条anacron任务分为四个部分,从左到右依次为:

  • 周期(天):设置任务执行的频率,以天数为单位,写1则表明天天执行,写3则表明每3天执行,可使用特殊符号“@”,@daily表明天天,@weekly表明每周,@monthly表明每个月。
  • 延迟时间:设置任务的延迟时间,以分钟为单位,好比写5,则当anacron启动后,anacron等待5分钟就会执行该任务。设置延迟时间是为了当机器启动时不会由于执行不少anacron任务而过载。
  • 任务标识:其目的是识别消息,日志文件和执行特殊操做。
  • 要执行的命令

在/etc/anacrontab中的三条默认anacron任务中,nice命令用来调整后面命令的优先级,run-parts命令用来执行设置的目录下的全部脚本,就是说这三条任务分别天天,每周,每个月执行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目录下的脚本。因此咱们不用本身往/etc/anacrontab中添加anacrontab任务,而只需把脚本放到相应的目录下,anacron就会周期性的执行这些脚本了。

3.2.anacron如何运行

既然anacron不是守护进程,那它是如何作到周期性执行任务的呢?在centos7下,cron会运行/etc/cron.d/0hourly,在/etc/cron.d/0hourly文件里,有一条cron任务是这样的: 01 * * * * root run-parts /etc/cron.hourly 这条cron任务会运行/etc/cron.hourly目录下的全部脚本,其中有一个名为0anacron的脚本,该脚本则会在合适的时间运行anacron,anacron则会检查/etc/anacrontab,在合适的时间分别运行/etc/cron.daily,/etc/cron.weekly,/etc/cron.monthly目录下的脚本。

参考资料:

How to Schedule Job on Linux using Cron, Anacron and at Commands

How to use cron in Linux

欢迎浏览个人我的博客,https://diwugebingren.github.io

欢迎关注个人公众号
相关文章
相关标签/搜索