在linux下,如果想要在未来的某个时刻执行某个任务,并且在未来的每一个这样的时刻里都要执行这个任务。举个简单的例子,比如说想要在将来,每天的十二点都重启路由器,大多数发行版都自带一个守护进程(daemon)cron来完成这项工作。这篇文章主要介绍了在linux上定期执行命令、脚本(cron,crontab,anacron)的相关知识

1. cron,crontab以及anacron的关系

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

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

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

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任务所设置的执行时间相同,则执行任务。

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

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

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

#你也可以使用自己喜爱的其他终端编辑器
EDITOR=vim; export EDITOR

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

[root@calc ~]# crontab -help
crontab:无效选项 -- h
crontab: usage error: unrecognized option
Usage:crontab [options] filecrontab [options]crontab -n [hostname]Options:-u <user>  define user-e         edit user's crontab-l         list user's crontab-r         delete user's crontab-i         prompt before deleting-n <host>  set host in cluster to run users' crontabs-c         get host in cluster to run users' crontabs-s         selinux context-x <mask>  enable debuggingDefault operation is replace, per 1003.2

创建并编辑当前用户的crontab

crontab -e

列出当前用户的crontab

crontab -l

删除用户l user01 的crontab

 crontab -u user01 -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目录下的脚本。

系统建立的时间任务配置文件:

vim /etc/crontab 记录“系统中”默认定义的一些计划任务。

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly*    *    *    *    * root /bin/echo "111111111" > /dev/pts/0 (直接写命令)
* * * * * root /test/dir1/test.sh (运行单个脚本)
* * * * * root run-parts /test/dir1 (运行目录下的所有可执行程序)

注意,写在这里的时间任务必须指明 运行该命令的用户身份
一般都是 root
run-parts:可以执行某个目录下的所有脚本文件

linux cron crontab anacron 计划任务 定时任务相关推荐

  1. linux 定时器 crontab 实例 计划任务 定时任务

    centos7 root用户为例,新建文件 /var/spool/cron/root 其中root代表用户名,写入以下实例,通过 crontab -l 即可查看定时任务列表 格式解释:  *      ...

  2. cron crontab anacron anacrontab Linux下的计划任务

    命令/进程 程序位置 读取文件 日志 crond crontab anacron /etc/rc.d/init.d(/etc/init.d) /lib/systemd/system/crond.ser ...

  3. linux shell crond crontab 定时器 计划任务 定时任务

    一.crontab是什么? 1.定时任务软件种类 at 适合仅执行一次就结束的调度命令,需要启动一个后端的atd服务.  crontab 需要启动一个服务crond才行,crond服务通过cronta ...

  4. php乱炖,linux使用crontab实现PHP执行定时任务 | 乱炖

    首先说说cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 crontab 都被保存在/var/spool/cron 目 ...

  5. linux cron 服务,Linux定时任务Crontab详解(推荐)

    今天做了个数据库的备份脚本,顺便系统得学习一下linux下定时执行脚本的设置.Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows稍微复杂一些(因为没有图形界面 ...

  6. Linux[Mac] Crontab 定时任务学习与探究

    1.应用场景 主要用于在服务器[linux]上编写定时脚本,执行执行任务,同时明白存在的问题. 2.学习/操作 环境 阿里云ECS centOS 7.4 root权限 1. 文档阅读 Linux Cr ...

  7. linux centos 7 crontab 启动,CentOS 7 Linux执行crontab 计划任务实操 - 好应网

    [inlosc_lg_title]一.环境准备[/inlosc_lg_title] yum install vixie-cron #安装定时任务插件 yum install crontabs #安装定 ...

  8. Linux计划任务-定时任务

    Linux计划任务-定时任务 at单次计划任务 at命令格式 查看at任务 取消at计划任务 创建1分钟后的单次任务 定时任务分类 cron`系统任务调度` /etc/crontab文件格式 用户任务 ...

  9. Linux下添加计划任务,Linux系统下使用crontab添加计划任务的方法

     在服务器中添加定期执行的任务,在很多情况下是非常必要的.比如,每天清理一次/tmp目录下的文件;没几分钟检查某一守护进程是否正常等等.这样计划任务就显得尤为方便.下面将介绍如何在Linux系统中 ...

最新文章

  1. 汇编和python-现在是Java和Python的时代,有谁还需要C以及汇编呢?
  2. tableau可视化函数使用案例(六十七)-Tableau饼图及其变种(环形图、南丁格尔玫瑰图、旭日图)
  3. Python2爬虫学习系列教程
  4. jsfor循环终止_详解如何在JS代码中消灭for循环
  5. springboot 注解_springBoot注解大全
  6. LINUX安装文件DEB的postrm运行报错,无法卸载怎么办
  7. 计算机it dt ct基础知识,ot是什么意思(什么是CT,IT,DT,OT)
  8. Eclipse导入maven项目或项目组
  9. 从0开始的网游ARPG实战案例:暗黑战神(第五六章:主城角色控制和任务引导系统)
  10. 硬禾课堂 - 一分钟焊接小技巧
  11. Android studio底部Logcat模块不见了以及Locat日志中包含了很多无用的错误日志筛选方法
  12. 虚拟服务器欠费是什么原因,辟谣:Elysium解释近期服务器崩溃的原因 非服务器欠费 而是闪电...
  13. 【WSN通信】基于matlab粒子群算法改进能量均衡高效WSN LEACH协议【含Matlab源码 1562期】
  14. Java微服务实战项目推荐
  15. 2022年襄阳中级工程师职称水平能力测试成绩出来了吗?
  16. 高斯-约当 (Gauss-Jordan) 消元法 [学习笔记]
  17. 电子面单接口申请对接(返回电子面单模板)
  18. 尝试用 vue 实现灭霸打响指英雄消失的效果 demo
  19. 亚马逊补单是怎么做的?
  20. 网页偶尔出现 No input file specified 提示

热门文章

  1. 微服务架构 — Overview
  2. IPython基础使用_Round2
  3. 8G的U盘轻松帮助你安装win7/win8/win10/xp系统
  4. 分布式理论(一) - CAP定理
  5. asp.net core选项配置的研究
  6. 12 个最佳的免费学习编程的游戏网站【转】
  7. windows环境下如何安装memcached教程
  8. MySQL数据单个数据太大,导入不进去
  9. [连载]JavaScript讲义(05)--- 数据处理
  10. 服务器托管租用商考虑什么