美文网首页
Linux基础篇-第十五章-例行性工作排程(crontab)

Linux基础篇-第十五章-例行性工作排程(crontab)

作者: taogan | 来源:发表于2021-08-03 10:07 被阅读0次

指令


at [-mldv] TIME  或  at -c 工作号码:排队、检查或删除以后要执行的工作
      m :当 at 的工作完成后,即使没有输出讯息,亦以 email 通知使用者该工作已完成。
      -l :at -l 相当于 atq,列出目前系统上面的所有该用户的 at 排程;
      -d :at -d 相当于 atrm ,可以取消一个在 at 排程中的工作;
      -v :可以使用较明显的时间格式栏出 at 排程中的任务栏表;
      -c :可以列出后面接的该项工作的实际指令内容。

      TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:
       HH:MM ex> 04:00
      在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。
       HH:MM YYYY-MM-DD ex> 04:00 2015-07-30
      强制规定在某年某月的某一天的特殊时刻进行该工作!
       HH:MM[am|pm] [Month] [Date] ex> 04pm July 30
      也是一样,强制在某年某月某日的某时刻进行!
       HH:MM[am|pm] + number [minutes|hours|days|weeks]
      ex> now + 5 minutes ex> 04pm + 3 days
      就是说,在某个时间点『再加几个时间后』才进行。

crontab [-u username] [-l|-e|-r] :循环执行的例行性工作排程
      -u :只有 root 才能进行这个任务,亦即帮其他使用者建立/移除 crontab 工作排程;
      -e :编辑 crontab 的工作内容
      -l :查阅 crontab 的工作内容
      -r :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑

anacron [-sfn] [job]..  或  anacron -u [job].. :定期运行命令
      -s :开始一连续的执行各项工作 (job),会依据时间记录文件的数据判断是否进行;
      -f :强制进行,而不去判断时间记录文件的时间戳;
      -n :立刻进行未进行的任务,而不延迟 (delay) 等待时间;
      -u :仅更新时间记录文件的时间戳,不进行任何工作。
      job :由 /etc/anacrontab 定义的各项工作名称。

Linux 工作排程的种类: at, cron

at:at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时, 必须要有 atd 这个服务 (第十七章) 的支援才行。在某些新版的 distributions 中,atd 可能预设并没有启动,那么 at 这个指令就会失效呢!不过我们的 CentOS 预设是启动的!

crontab:crontab 这个指令所设定的工作将会循环的一直进行下去! 可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab 来支持。 至于让 crontab 可以生效的服务则是 crond 这个服务喔!

仅执行一次的工作排程

at 的运作方式

我们使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了

并不是所有的人都可以进行 at 工作排程!因为安全的理由,除非是你认可的账号,否则先不要让他们使用 at

我们可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制! 加上这两个文件后,at 的工作情况其实是这样的:

1、先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at(即使没有写在 at.deny 当中)

2、如果 /etc/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用 at ,而没有在这个 at.deny 文件中的使用者,就可以使用 at 咯;

3、如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

/etc/at.allow 是管理较为严格的方式,而 /etc/at.deny 则较为松散 (因为账号没有在该文件中,就能够执行 at 了)。在一般的 distributions 当中,由于假设系统上的所有用户都是可信任的,因此系统通常会保留一个空的 /etc/at.deny 文件,意思是允许所有人使用 at 指令的意思 (您可以自行检查一下该文件)。 不过,万一你不希望有某些使用者使用 at 的话,将那个使用者的账号写入 /etc/at.deny 即可! 一个账号写一行

实际运作单一工作排程

由于 at 工作排程的使用上,系统会将该项 at 工作独立出你的 bash 环境中, 直接交给系统的atd程序来接管,因此,当你下达了 at 的工作之后就可以立刻脱机了, 剩下的工作就完全交给Linux 管理即可!

batch:系统有空时才进行背景任务

其实 batch 是利用 at 来进行指令的下达!只是加入一些控制参数而已。这个 batch 神奇的地方在于:他会在 CPU 的工作负载小于 0.8 的时候,才进行你所下达的工作任务! 那什么是工作负载0.8 呢?这个工作负载的意思是: CPU 在单一时间点所负责的工作数量。不是 CPU的使用率!举例来说,如果我有一只程序他需要一直使用 CPU 的运算功能,那么此时 CPU 的使用率可能到达100% , 但是 CPU 的工作负载则是趋近于『 1 』,因为 CPU 仅负责一个工作嘛!如果同时执行这样的程序两支呢? CPU 的使用率还是 100% ,但是工作负载则变成 2 了!

循环执行的例行性工作排程

使用者的设定

使用者想要建立循环型工作排程时,使用的是 crontab 这个指令啦~不过,为了安全性的问题,与 at同样的,我们可以限制使用 crontab 的使用者账号喔!使用的限制数据有:
1、/etc/cron.allow:
将可以使用 crontab 的账号写入其中,不在这个文件内的使用者则不可使用 crontab

2、/etc/cron.deny:
将不可以使用 crontab 的账号写入其中,未记录到这个文件当中的使用者,就可以使用 crontab

以优先级来说,/etc/cron.allow 比 /etc/cron.deny 要优先, 而判断上面,这两个文件只选择一个来限制而已,因此,建议你只要保留一个即可, 免得影响自己在设定上面的判断!一般来说,系统默认是保留 /etc/cron.deny , 你可以将不想让他执行 crontab 的那个使用者写入 /etc/cron.deny 当中,一个账号一行!

当用户使用 crontab 这个指令来建立工作排程之后,该项工作就会被纪录到 /var/spool/cron/ 里面去了,而且是以账号来作为判别的!举例来说, dmtsai 使用 crontab 后, 他的工作会被纪录到/var/spool/cron/dmtsai 里头去!但请注意,不要使用 vi 直接编辑该文件, 因为可能由于输入语法错误,会导致无法执行 cron!另外, cron 执行的每一项工作都会被纪录到/var/log/cron 这个登录档中,所以,如果你的 Linux 不知道有否被植入木马时,也可以搜一下 /var/log/cron 这个登录档呢!

crontab语法:

image.png

预设情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面, 然后以一个工作一行来编辑,编辑完毕之后输入『 :wq 』储存后离开 vi 就可以了! 而每项工作 (每行)的格式都是具有六个字段,这六个字段的意义为:

image.png

周的数字为0 或 7 时,都代表『星期天』的意思!另外,还有一些辅助的字符,大概有底下这些:

image.png

系统的配置文件: /etc/crontab, /etc/cron.d/*

这个『 crontab -e 』是针对使用者的 cron 来设计的,如果是『系统的例行性任务』时,你只要编辑 /etc/crontab 这个文件就可以啦!有一点需要特别注意喔!那就是 crontab -e 这个 crontab 其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 可是一个『纯文本档』喔!你可以 root 的身份编辑一下这个文件!

基本上,cron 这个服务的最低侦测限制是『分钟』,所以『 cron 会每分钟去读取一次 /etc/crontab 与 /var/spool/cron 里面的数据内容 』,因此,只要你编辑完/etc/crontab 这个文件,并且将他储存之后,那么 cron 的设定就自动的会来执行了!

crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的 Unix 系统中,由于crontab 是读到内存当中的,所以在你修改完 /etc/crontab之后,可能并不会马上执行, 这个时候请重新启动 crond 这个服务!『systemctl restart crond』

crond 服务读取配置文件的位置

一般来说,crond 预设有三个地方会有执行脚本配置文件,他们分别是:
/etc/crontab
/etc/cron.d/*
/var/spool/cron/*

这三个地方中,跟系统的运作比较有关系的两个配置文件是放在 /etc/crontab 文件内以及 /etc/cron.d/* 目录内的文件, 另外一个是跟用户自己的工作比较有关的配置文件,就是放在 /var/spool/cron/里面的文件群。

如果你想要自己开发新的软件,该软件要拥有自己的 crontab 定时指令时,就可以将『分、时、日、月、周、身份、指令』的配置文件放置到 /etc/cron.d/ 目录下! 在此目录下的文件是『crontab 的配置文件脚本』。

总结一下:

个人化的行为使用『 crontab -e 』:如果你是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e 来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到 (/etc/crontab 是大家都能读取的权限!);

系统维护管理使用『 vim /etc/crontab 』:如果你这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入 /etc/crontab 较佳!

自己开发软件使用『 vim /etc/cron.d/newfile 』:如果你是想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于 /etc/cron.d/ 目录内即可。

固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来集中管理较好。 如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目录中,直接写入指令即可!

一些注意事项

资源分配不均的问题

如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙,所以,这个时候就必须要分别设定,假设如果我们有四个工作都是五分钟要进行一次的,我可以这样:

image.png
取消不要的输出项目

当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给 MAILTO 设定的账号,直接以『数据流重导向』将输出的结果输出到 /dev/null 这个垃圾桶当中

安全的检验

很多时候被植入木马都是以例行命令的方式植入的,所以可以藉由检查 /var/log/cron 的内容来视察是否有『非您设定的 cron 被执行了?』这个时候就需要小心一点

周与日月不可同时并存

另一个需要注意的地方在于:『你可以分别以周或者是日月为单位作为循环,但你不可使用「几月几号且为星期几」的模式工作』。 这个意思是说,你不可以这样编写一个工作排程:

image.png

本来你以为九月十一号且为星期五才会进行这项工作,无奈的是,系统可能会判定每个星期五作一次,或每年的 9 月 11 号分别进行,如此一来与你当初的规划就不一样了

可唤醒停机期间的工作任务

什么是 anacron

anacron 并不是用来取代 crontab 的,anacron 处理非 24 小时一直启动的 Linux 系统的 crontab 的执行! 以及因为某些原因导致的超过时间而没有被执行的排程工作。

其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的排程任务有没有被执行,如果有超过期限的工作在, 就执行该排程任务,执行完毕或无须执行任何排程时,anacron 就停止了。

anacron 预设会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令

anacron 与 /etc/anacrontab

anacron 其实是一支程序并非一个服务!这支程序在 CentOS 当中已经进入 crontab 的排程!同时 anacron 会每个小时被主动执行一次,所以 anacron 的配置文件是放置在/etc/cron.hourly下

在我们的 CentOS 中,anacron 的进行其实是在每个小时都会被抓出来执行一次, 但是为了担心 anacron 误判时间参数,因此 /etc/cron.hourly/ 里面的 anacron 才会在档名之前加个 0 (0anacron),让 anacron 最先进行!就是为了让时间戳先更新!以避免 anacron 误判 crontab 尚未进行任何工作的意思。

接下来我们看一下 anacron 的配置文件: /etc/anacrontab 的内容好了:

image.png

我们拿 /etc/cron.daily/ 那一行的设定来说明好了。那四个字段的意义分别是:

  1. 天数:anacron 执行当下与时间戳 (/var/spool/anacron/ 内的时间纪录文件) 相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。

  2. 延迟时间:若确定超过天数导致要执行排程工作了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题吧!

  3. 工作名称定义:这个没啥意义,就只是会在 /var/log/cron 里头记载该项任务的名称这样!通常与后续的目录资源名称相同即可。

  4. 实际要进行的指令串:有没有跟 0hourly 很像啊!没错!相同的作法啊!透过 run-parts 来处理的!

根据上面的配置文件内容,我们大概知道 anacron 的执行流程应该是这样的 (以 cron.daily 为例):

  1. 由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;

  2. 由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;

  3. 由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;

  4. 若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的设定);

  5. 延迟时间过后,开始执行后续指令,亦即『 run-parts /etc/cron.daily 』这串指令;

  6. 执行完毕后, anacron 程序结束。

最后,我们来总结一下本章谈到的许多配置文件与目录的关系吧!这样我们才能了解 crond 与 anacron 的关系:

  1. crond 会主动去读取 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 等配置文件,并依据『分、时、日、月、周』的时间设定去各项工作排程;

  2. 根据 /etc/cron.d/0hourly 的设定,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件;

  3. 因为 /etc/cron.hourly/0anacron 这个脚本文件的缘故,主动的每小时执行 anacron ,并呼叫 /etc/anacrontab 的配置文件;

  4. 根据 /etc/anacrontab 的设定,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的执行文件,以进行固定周期需要执行的指令。

也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?对啦!因为 /etc/anacrontab 的定义

总结:

  1. 系统可以透过 at 这个指令来排程单一工作的任务!『at TIME』为指令下达的方法,当 at 进入排程后, 系统执行该排程工作时,会到下达时的目录进行任务;

  2. at 的执行必须要有 atd 服务的支持,且 /etc/at.deny 为控制是否能够执行的使用者账号;

  3. 透过 atq, atrm 可以查询与删除 at 的工作排程;

  4. batch 与 at 相同,不过 batch 可在 CPU 工作负载小于 0.8 时才进行后续的工作排程;

  5. 系统的循环例行性工作排程使用 crond 这个服务,同时利用 crontab -e 及 /etc/crontab 进行排程的安排;

  6. crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;

  7. /etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;

  8. anacron 配合 /etc/anacrontab 的设定,可以唤醒停机期间系统未进行的 crontab 任务!

相关文章

  • Linux基础篇-第十五章-例行性工作排程(crontab)

    指令 Linux 工作排程的种类: at, cron at:at 是个可以处理仅执行一次就结束排程的指令,不过要执...

  • Linux学习日记——例行性工作排程

    例行性工作排程可以理解为定时任务。主机自动在某时间开始固定的进程或者服务。Linux的工作排程有两种:at、cro...

  • Linux例行性工作

    Linux工作调度的种类:at,cron 两种工作调度的方式: 1、一种是突发性的,这次昨晚就不会在做,也就是单次...

  • 例行性任务(crontab)

    系统经常会主动执行一些任务,这些任务可能又分为“单一”工作与“循环”工作。 1、什么是例行性工作 有的工作是例行性...

  • 在 Mac 上使用 crontab 服务

    1. crontab介绍 crontab 是 linux 下的定时任务工具,类似于Windows系统中的任务计划程...

  • Android内核剖析(完整版)PDF

    第1部分 基础篇 第1章 linux基础2 1.1 linux文件系统概述2 1.2 linux启动过程4 1.3...

  • linux Crontab

    Linux Crontab:Linux中用于执行定时任务的工具crontab -e:编辑定时任务crontab -...

  • Linux定时任务(1)— crontab

    执行定时任务 crontab 执行循环任务 at 执行一次性任务 crontab简介 Linux 系统有个 c...

  • Linux定时计划反弹shell

    linux shell 之 crontab(定时任务)详解首先了解一下linux下的crontab crontab...

  • Crontab 命令

    crontab概念: crontab命令常见于Unix和Linux的操作系统之中,用于设置周期性被执行的指令。 工...

网友评论

      本文标题:Linux基础篇-第十五章-例行性工作排程(crontab)

      本文链接:https://www.haomeiwen.com/subject/waydvltx.html