例行工作排程cron/at/anacron
文章目录
1. 例行工作排程的概念及linux实现
工作或学习中,一般会有两种事项:一种是例行性的,比如上班的打卡,每周的组会等;另一种是突发性的,比如领导突然安排一个紧急任务,做完之后就不用再继续跟进了。
针对以上两种事项,对于linux系统而言有两种方式进行:
-
crontab
: 可进行循环例行性工作排程。例行性的由crontab指令通过修改crond服务来实现。可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑/etc/crontab 来支持。 -
at
:可以处理仅执行一次就结束排程的指令。突发性的由at指令通过修改atd服务来实现。at是个可以处理仅执行一次就结束排程的指令,执行at时, 必须要有atd 这个服务的支持。
除开以上两种情况,还有一种情况是预计进行但因为种种原因(宕机、关机等)未准时推进,针对这种排程事项,linux引入了anacron
程序来解决该问题,其可以唤醒停机期间的工作任务。也即处理非24小时一直启动的Linux 系统的crontab 的执行。
2. 仅执行一次的工作排程
2.1 at排程指令
在进行突发性工作排程的时候,需要用到atd服务,首先要检查atd服务的运行状态,指令为systemctl status atd
,若是预设未打开atd服务,使用systemctl restart atd
; systemctl enable atd
指令启用即可。此外,at指令最小的时间单位是分钟,也即其工作是每分钟检查一次来处理的。
若是启用后,标志如下:
设置突发性工作的排程的限制:
- 1.
/etc/at.allow
文件,在该文件中的使用者才能够使用at,否则不能使用,即使没有在/etc/at.deny文件当中; - 2.
/etc/at.deny
文件,当/etc/at.allow文件不存在,找到这个文件,若是使用者被写入该文件中则不可使用at,而不在文件中的用户可以使用at指令; - 3.如果两个文件均不存在,则只有超级管理员用户root才可使用at指令。以上文件在写入允许或限制的用户名时,一个用户名一行即可。
设置突发性工作的排程的方式 :使用at 指令产生所要运作的工作,并将工作以文本文件的方式写入/var/spool/at/
目录内,该工作便能等待atd 这个服务的取用与执行了。
at
指令的格式,比如:at now + 5 minutes
时间单位要加遵循英文的单复数原则。
使用at指令的注意事项:
- 进行at排程过程中,最好使用绝对路径下达指令,因为指令的下达与PATH变量有关,还与wd有关。
- at 的执行与终端机环境无关,而所有standard output/standard error output 都会传送到执行者的mailbox,若是想要实现,通过终端机的装置处理,若是tty2登陆,则有
echo "Hi" > /dev/tty2
代替。
at指令排程的好处:
- 远程连接跑程序时,可以忽略控制端的连接,在远程服务器上进行程序运行,期间完全由服务器上的atd程序接管,下达at之后可以断开远程,不会影响已排程的程序运行;
- 再个就是对于突发性工作的排程。
at工作的管理:
-
atq
用来查询当前已排程的仅执行一次的工作; -
atrm (jobnumber)
用来移除错误的工作排程指令。
2.2 batch排程指令
batch
是加入一些控制参数的at 指令,使用方式与at
指令相同,管理也是使用atq/atrm
。其设定为在CPU 的工作负载小于0.8 的时候,才进行batch所下达的工作任务。其中工作负载的概念不同于CPU使用率,而是单位时间CPU所负责的工作/进程数。其设计目的是在CPU工作负载较大的时候,能够缓解CPU排程上的压力。
系统的工作负载查看使用uptime
指令,可以观察到1, 5, 15 分钟的平均工作负载量。
3. 循环执行的例行性工作排程
3.1 crontab排程指令
当用户使用crontab
这个指令来建立工作排程之后,该项工作就会被纪录到/var/spool/cron/
里去,且以账号作为判别,对于每个用户,以gavin为例,若是其设置了cron排程任务,他的工作记录会记录到/var/spool/cron/gavin
当中。另外, cron 执行的每一项工作都会被纪录到/var/log/cron
这个登录档中,而木马病毒通常会使用cron对自身进行排程,所以可以查看该文档以确定是否系统遭到入侵。
crontab
指令对用户的限制使用同at对用户的限制使用相同,只不过是/etc/at.allow
和/etc/at.deny
文件换成了/etc/crontab.allow
和/etc/crontab.deny
。补充一下,以上两个文件只保留一个即可,系统中默认保留的一般是*.deny
文件。
系统预设条件下,使用者若是未被列入/etc/cron.deny
当中,下达crontab -e
命令即可编辑自己的而非系统的例行性命令,进入vi的编辑画面,编辑规则为一个工作一行,如下所示:
对于每项工作的格式有6个字段,字段意义如下:
此外时间字段当中还有特殊字符规定,以满足对于排程时间要求的需求,特殊字符含义如下:
3.2 crond服务的配置文件/etc/crontab,/etc/cron.d/*
crontab -e
指令(usr/bin/crontab
二进制文件)用于设置用户自己的循环例行性任务,若是想要设置系统的循环例行工作,只需要编辑/etc/crontab
文件即可。
crond 服务的最低侦测限制是分钟,所以cron 会每分钟去读取一次/etc/crontab
与/var/spool/cron
里面的数据内容,并执行文件中要求的指令。
-
/etc/crontab文件的内容
-
/etc/cron.d/*
开发非系统软件时,该软件要拥有自己的crontab 定时指令(系统例行工作排程)时,就可以将分、时、日、月、周、身份、指令的配置文件放置到/etc/cron.d/
目录下。 在此目录下的文件是crontab 的配置文件脚本。其内容跟 /etc/crontab 几乎一模一样,也设置规则相同,只是设定值不同。
3.3 crond服务要读取的配置文件
一般来说,crond 预设有三个地方会有执行脚本配置文件,他们分别是:
-
/etc/crontab
:系统循环执行的工作排程 -
/etc/cron.d/*
:非系统软件自定义的循环执行的工作排程 -
/var/spool/cron/*
:用户个人自定义的循环执行的工作排程
总结:
-
个人化的行为使用
crontab -e
:如果你是依据个人需求来建立的例行工作排程,建议直接使用crontab -e
来建立你的工作排程较佳! 这样也能保障你的指令行为不会被大家看到(/etc/crontab 是大家都能读取的权
限喔!); -
系统维护管理使用
vim /etc/crontab
:如果你这个例行工作排程是系统的重要工作,为了让自己管理方
便,同时容易追踪,建议直接写入/etc/crontab 较佳! -
自己开发软件使用
vim /etc/cron.d/newfile
:如果你是想要自己开发软件,那当然最好就是使用全新的配
置文件,并且放置于/etc/cron.d/ 目录内即可。 -
固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到/etc/crontab 中来
集中管理较好。如果想要偷懒,或者是一定要再某个周期内进行的任务,也可以放置到上面谈到的几个目
录中,直接写入指令即可.
3.4 使用crond服务的注意事项
- 资源分配不均:若是每个流程都在同一时间启动会造成系统繁忙,所以须分段设定,如下:
- 取消不要的输出,可用shell的重定向功能将输出结果导至/dev/null中;
- 安全检验:查看/var/log/cron文件;
- 星期与日月的设定不要共存,星期定了日期也相对固定,日月固定星期就确定了。
4. 唤醒停机期间排程的工作任务
anacron
存在目的:
①处理非24小时一直启动的Linux 系统的crontab 的执行;
②以及因为某些原因导致的超过时间而没有被执行的排程工作。
其也是每个小时被crond 执行一次,然后anacron 再去检测相关的排程任务有没有被执行,如果有超过期限的工作在, 就执行该排程任务,执行完毕或无须执行任何排程时,anacron 就停止了。
由上可知,anacron的配置文件应当放置在/etc/cron.hourly
当中,其本身是一个shell脚本。
还有就是/etc/anacrontab
和/var/spool/anacron/*
具体内容如下流程
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 程序结束。
anacron语法:
/etc/cron.hourly
脚本中最后一句为/usr/sbin/anacron -s
,就是执行未进行的排程工作的指令