指令
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 时,都代表『星期天』的意思
!另外,还有一些辅助的字符,大概有底下这些:
系统的配置文件: /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/ 那一行的设定来说明好了。那四个字段的意义分别是:
-
天数:anacron 执行当下与时间戳 (/var/spool/anacron/ 内的时间纪录文件) 相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。
-
延迟时间:若确定超过天数导致要执行排程工作了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题吧!
-
工作名称定义:这个没啥意义,就只是会在 /var/log/cron 里头记载该项任务的名称这样!通常与后续的目录资源名称相同即可。
-
实际要进行的指令串:有没有跟 0hourly 很像啊!没错!相同的作法啊!透过 run-parts 来处理的!
根据上面的配置文件内容,我们大概知道 anacron 的执行流程应该是这样的 (以 cron.daily 为例):
-
由 /etc/anacrontab 分析到 cron.daily 这项工作名称的天数为 1 天;
-
由 /var/spool/anacron/cron.daily 取出最近一次执行 anacron 的时间戳;
-
由上个步骤与目前的时间比较,若差异天数为 1 天以上 (含 1 天),就准备进行指令;
-
若准备进行指令,根据 /etc/anacrontab 的设定,将延迟 5 分钟 + 3 小时 (看 START_HOURS_RANGE 的设定);
-
延迟时间过后,开始执行后续指令,亦即『 run-parts /etc/cron.daily 』这串指令;
-
执行完毕后, anacron 程序结束。
最后,我们来总结一下本章谈到的许多配置文件与目录的关系吧!这样我们才能了解 crond 与 anacron 的关系:
-
crond 会主动去读取 /etc/crontab, /var/spool/cron/*, /etc/cron.d/* 等配置文件,并依据『分、时、日、月、周』的时间设定去各项工作排程;
-
根据 /etc/cron.d/0hourly 的设定,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件;
-
因为 /etc/cron.hourly/0anacron 这个脚本文件的缘故,主动的每小时执行 anacron ,并呼叫 /etc/anacrontab 的配置文件;
-
根据 /etc/anacrontab 的设定,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 内的执行文件,以进行固定周期需要执行的指令。
也就是说,如果你每个周日的需要执行的动作是放置于 /etc/crontab 的话,那么该动作只要过期了就过期了,并不会被抓回来重新执行。但如果是放置在 /etc/cron.weekly/ 目录下,那么该工作就会定期,几乎一定会在一周内执行一次~如果你关机超过一周,那么一开机后的数个小时内,该工作就会主动的被执行喔! 真的吗?对啦!因为 /etc/anacrontab 的定义
总结:
-
系统可以透过 at 这个指令来排程单一工作的任务!『at TIME』为指令下达的方法,当 at 进入排程后, 系统执行该排程工作时,会到下达时的目录进行任务;
-
at 的执行必须要有 atd 服务的支持,且 /etc/at.deny 为控制是否能够执行的使用者账号;
-
透过 atq, atrm 可以查询与删除 at 的工作排程;
-
batch 与 at 相同,不过 batch 可在 CPU 工作负载小于 0.8 时才进行后续的工作排程;
-
系统的循环例行性工作排程使用 crond 这个服务,同时利用 crontab -e 及 /etc/crontab 进行排程的安排;
-
crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;
-
/etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;
-
anacron 配合 /etc/anacrontab 的设定,可以唤醒停机期间系统未进行的 crontab 任务!
网友评论