Linux(13):例行性工作排程

例行性工程

听谓的排程是将工作安排执行的流程之意。
Linux 排程就是透过 crontab 与 at 这两个东西。

两种工作排程的方式:
一种是例行性的,就是每隔一定的周期要来办的事项;
一种是突发性的,就是这次做完以后就没有的那一种;

at: at 是个可以处理仅执行一次就结束排程的指令,不过要执行 at 时,必须要有 atd 这个服务的支援才行。在某些新版的 distributions 中, atd可能预设并没有启动,那么 at 这个指令就会失效。不过CentOS预设是启动的;
crontab: crontab 这个指令所设定的工作将会循环的一直进行下去。可循环的时间为分钟、小时、每周、每月或每年等。crontab 除了可以使用指令执行外,亦可编辑 /etc/crontab来支持。至于让 crontab 可以生效的服务则是crond这个服务。

有点像仅一次的闹钟和重复的闹钟。。。。

CentOS Linux系统上常见的例行性工作

基本上 Linux 系统常见的例行性任务有:
进行登录档的轮替(log rotate):
Linux 会主动的将系统所发生的各种信息都记录下来,这就是登录档。由于系统会一直记录登录信息,所以登录文件将会越来越大。我们知道大型文件不但占容量还会造成读写效能的困扰,因此适时的将登录文件数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录信息。这就是 logrotate 的任务,也是系统必要的例行任务;
登录文件分析 logwatch 的任务:
如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误信息都会被记录到登录文件中,因此系统管理员的重要任务之一就是分析登录档。但不可能手动透过 vim等软件去检视登录文件,因为数据太复杂了。CentOS 提供了一只程序【 logwatch 】来主动分析登录信息,所以会发现, root 老是会收到标题为 logwatch 的信件,那是正常的。
建立 locate 的数据库:
该指令是透过已经存在的文件名数据库来进行系统上文件名的查询。文件名数据库是放置到 /var/lib/ mlocate/ 中。问题是,系统的例行性工作,会主动的进行updatedb 这个数据库。
man page 查询数据库的建立:
与 locate 数据库类似的,可提供快速查询的 man page db也是个数据库,但如果要使用 man page 数据库时,就得要执行mandb才能够建立好。而这个man page数据库也是透过系统的例行性工作排程来自动执行的。
RPM 软件登录文件的建立:
RPM 是一种软件管理的机制。由于系统可能会常常变更软件,包括软件的新安装、非经常性更新等,都会造成软件文件名的差异。为了方便未来追踪,系统将文件名作个排序的记录。有时候系统也会透过排程来帮忙RPM 数据库的重新建置。
移除暂存档:
某些软件在运作中会产生一些暂存档,但是当这个软件关闭时,这些暂存盘可能并不会主动的被移除。有些暂存盘则有时间性,如果超过一段时间后,这个暂存盘就没有效用了,此时移除这些暂存盘就是一件重要的工作。否则磁盘容量会被耗光。系统透过例行性工作排程执行名为 tmpwatch 的指令来删除这些暂存档呢!
与网络服务有关的分析行为:
如果有安装类似 WWW 服务器软件(一个名为 apache 的软件),那么Linux系统通常就会主动的分析该软件的登录文件。同时某些凭证与认证的网络信息是否过期的问题,Linux 系统也会进行自动检查。

仅执行一次的例行性工程

atd 的启动与 at 运作的方式

要使用单一工作排程时,Linux系统上面必须要有负责这个排程的服务,那就是 atd。不过并非所有的Linux distributions都预设会把他打开的,所以呢,某些时刻必须要手动将他启用才行。
Linux(13):例行性工作排程_第1张图片

at 的运作方式:
既然是工作排程,那么应该会有产生工作的方式,并且将这些工作排进行程表中。
使用 at 这个指令来产生所要运作的工作,并将这个工作以文本文件的方式写入/var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用与执行了。

可以利用 /etc/at.allow 与 /etc/at.deny 这两个文件来进行 at 的使用限制。加上这两个文件后,at 的工作情况是这样的:
1.先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at,没有在这个文件中的使用者则不能使用 at (即使没有写在 at.deny 当中);
2.如果 /etcl/at.allow 不存在,就寻找 /etc/at.deny 这个文件,若写在这个 at.deny 的使用者则不能使用at ,
而没有在这个at.deny文件中的使用者,就可以使用 at;
3.如果两个文件都不存在,那么只有 root 可以使用 at 这个指令。

运行单一工作排程

at [-mldv] TIME
at -c 工作号码

Linux(13):例行性工作排程_第2张图片事实上,当我们使用 at 时会进入一个 at shell 的环境来让用户下达工作指令,此时,建议最好使用绝对路径来下达你的指令,比较不会有问题。由于指令的下达与 PATH 变量有关,同时与当时的工作目录也有关连(如果有牵涉到文件的话),因此使用绝对路径来下达指令,会是比较一劳永逸的方法。

为什么呢?举例来说,在/tmp 下达【at now】然后输入【 mail -s “test” root <.bashrc 】,那个.bashrc 的文件会是在哪里?答案是【/tmp/.bashrc】 。因为at 在运作时,会跑到当时下达 at 指令的那个工作目录的缘故。

终端机当然看不到任何信息:因为 at 的执行与终端机环境无关,而所有 standard outputl/standard error output都会传送到执行者的 mailbox去了。(有办法看到,【echo “内容”>/dev/tty1(终端机)】)

由于 at 工作排程的使用上,系统会将该项 at 工作独立出 bash 环境中,直接交给系统的 atd 程序来接管,因此,下达了at 的工作之后就可以立刻脱机了,剩下的工作就完全交给 Linux 管理即可。所以如果有长时间的网络工作时,使用 at 可以免除网络断线后的困扰。

at 工作的管理
在这里插入图片描述
atd 可以查看
atrm (jobnumber) 可以移除

batch:系统有空时才进行背景任务
batch 是利用 at 来进行指令的下达,只是加入一些控制参数而已。
batch 在CPU的工作负载小于 0.8 的时候,才进行所下达的工作任务。
工作负载的意思是:CPU 在单一时间点所负责的工作数量。不是CPU 的使用率。
举例来说,如果有一只程序他需要一直使用 CPU 的运算功能,那么此时CPU 的使用率可能到达100%,但是CPU的工作负载则是趋近于【1】,因为CPU仅负责一个工作。如果同时执行这样的程序两支,CPU 的使用率还是100%,但是工作负载则变成2了。
当 CPU 的工作负载越大,代表 CPU 必须要在不同的工作之间进行频繁的工作切换。

使用 uptime 可以观察到1,5,15分钟的【平均工作负载】量
在这里插入图片描述

循环执行的例行性工程

相对于 at 是仅执行一次的工作,循环执行的例行性工作排程则是由 cron (crond)这个系统服务来控制的。Linux系统上面原本就有非常多的例行性工作,因此这个系统服务是默认启动的。

使用者的设定

crontab 的使用的限制数据有:
./etc/cron.allow: 将可以使用 crontab 的账号写入其中,若不在这个文件内的使用者则不可使用crontab;
./etc/cron.deny:将不可以使用 crontab 的账号写入其中,若未记录到这个文件当中的使用者,就可以使用crontab。

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

crontab [-u username] [-l|-e|-r]

Linux(13):例行性工作排程_第3张图片预设情况下,任何使用者只要不被列入 /etc/cron.deny 当中,那么他就可以直接下达【crontab -e】去编辑自己的例行性命令了。整个过程就会进入vi 的编辑画面,然后以一个工作一行来编辑,编辑完毕之后输入【:wq 】储存后离开 vi 就可以了。
每项工作(每行)的格式都是具有六个字段,这六个字段的意义为:
在这里插入图片描述周的数字为0或7时,都代表【星期天】的意思。

辅助字符:
Linux(13):例行性工作排程_第4张图片

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

如果是【系统的例行性任务】时,可以编辑 /etc/crontab 这个文件就。有一点需要特别注意,【crontab -e】这个【crontab】其实是 /usr/bin/crontab 这个执行档,但是 /etc/crontab 是一个【纯文本档】。可以root 的身份编。

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

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

Linux(13):例行性工作排程_第5张图片
MAILTO=root:
这个项目是说,当 /etc/crontab 这个文件中的例行性工作的指令发生错误时,或者是该工作的执行结果有 STDOUT/STDERR 时,会将错误讯息或者是屏幕显示的讯息默认的由系统直接寄发一封mail 给root 。
PATH=…:
执行文件路径:输入执行文件的搜寻路径。
【分时日月周身份指令】七个字段的设定
这个 /etc/crontab 里面可以设定的基本语法与 crontab -e 不太相同。前面同样是分、时、日、月、周五个字段,但是在五个字段后面接的并不是指令,而是一个新的字段,那就是【执行后面那串指令的身份】为何。这与使用者的 crontab -e不相同。由于使用者自己的 crontab并不需要指定身份,但 /etc/crontab 里面当然要指定身份。系统默认的例行性工作是以 root的身份来进行的。

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

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

在这里插入图片描述
上面表格中提到的最后一行,每个整点的一分会执行【run-parts /etc/cron.hourly】。
什么是run-parts? 如果去分析一下这个执行档,会发现他就是 shell script,run-parts 脚本会在大约 5 分钟内随机选一个时间来执行 /etc/cron.hourly 目录内的所有执行文件。因此,放在 /etcl/cron.hourly/ 的文件,必须是能被直接执行的指令脚本,而不是分、时、日、月、周的设定值。

总结

个人化的行为使用【crontab -e】:如果是依据个人需求来建立的例行工作排程,建议直接使用 crontab -e来建立工作排程较佳,这样也能保障自己的指令行为不会被大家看到(/etc/crontab 是大家都能读取的权限);
系统维护管理使用【vim /etc/crontab】:如果这个例行工作排程是系统的重要工作,为了让自己管理方便,同时容易追踪,建议直接写入/etc/crontab较佳。
自己开发软件使用【vim /etc/cron.dnewfile】:如果想要自己开发软件,那当然最好就是使用全新的配置文件,并且放置于/etc/cron.d/目录内即可。
固定每小时、每日、每周、每天执行的特别工作:如果与系统维护有关,还是建议放置到 /etc/crontab 中来集中管理较好。

注意事项:
1.资源分配不均的问题
如果每个工作流程都在同一个时间启动的话,那么在某个时段时,系统会变的相当的繁忙,所以,这个时候就必须要分别设定。
2.取消不要的输出项目
另外一个困扰发生在【当有执行成果或者是执行的项目中有输出的数据时,该数据将会 mail 给MAILTO 设定的账号】,当有一个排程一直出错(例如 DNS 的侦测系统当中,若 DNS上层主机挂掉,那么你就会一直收到错误讯息!)
直接以【数据流重导向】将输出的结果输出到 /dev/null 这个垃圾桶当中就好了。
3.安全的检验
很多时候被植入木马都是以例行命令的方式植入的,所以可以由检查 /var/log/cron 的内容来视察是否有【非自己设定的 cron被执行了】
4.周与日月不可同时并存
另一个需要注意的地方在于:【可以分别以周或者是日月为单位作为循环,但你不可使用【几月几号且为星期几】的模式工作】。

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

anacron 这个指令主动进行时间到了但却没有执行的排程。

anacron

anacron 并不是用来取代 crontab 的,anacron 存在的目的是在处理非24小时一直启动的 Linux 系统的crontab 的执行以及因为某些原因导致的超过时间而没有被执行的排程工作。
其实 anacron 也是每个小时被 crond 执行一次,然后 anacron 再去检测相关的排程任务有没有被执行,如果有超过期限的工作在,就执行该排程任务,执行完毕或无须执行任何排程时,anacron就停止了。
由于 anacron 预设会以一天、七天、一个月为期去侦测系统未进行的 crontab 任务,因此对于某些特殊的使用环境非常有帮助。

anacron 怎么知道我们的系统啥时关机的呢?这就得要使用 anacron 读取的时间记录文件(timestamps)了。anacron 会去分析现在的时间与时间记录文件所记载的上次执行 anacron 的时间,两者比较后若发现有差异,那就是在某些时刻没有进行 crontab,此时 anacron就会开始执行未进行的crontab 任务了!

anacron 与 /etc/anacrontab

anacron 其实是一支程序并非一个服务,这支程序在 CentOS 当中已经进入crontab 的排程。同时anacron 会每个小时被主动执行一次。所以 anacron的配置文件应该放置在/etc/cron.hourly。
Linux(13):例行性工作排程_第6张图片

anacron 的语法:

anacron [-sfn] [job]...
anacron -u [job]

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

anacron 的配置文件,/etc/anacrontab 的内容:
Linux(13):例行性工作排程_第8张图片
在这里插入图片描述
天数:anacron 执行当下与时间戳 (/var/spool/anacron/内的时间纪录文件) 相差的天数,若超过此天数,就准备开始执行,若没有超过此天数,则不予执行后续的指令。
延迟时间:若确定超过天数导致要执行排程工作了,那么请延迟执行的时间,因为担心立即启动会有其他资源冲突的问题。
工作名称定义:这个没啥意义,就只是会在/var/log/cron里头记载该项任务的名称这样!通常与后续的目录资源名称相同即可。
实际要进行的指令串:有没有跟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程序结束。

如此一来,放置在 /etc/cron.daily/ 内的任务就会在一天后一定会被执行的。因为 anacron 是每个小时被执行一次,所以,现在这就是为什么隔了一阵子才将 CentOS 开机,开机过后约1小时左右系统会有一小段时间的忙碌,而且硬盘会跑个不停!那就是因为 anacron正在执行过去 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/ 里头的未进行的各项工作排程。

总结

crond 与 anacron 的关系:
1.crond 会主动去读取 /etc/crontab, /var/spool/cron/*, /etc/cron.d/*等等配置文件,并依据【分、时、日、月、周】的时间设定去各项工作排程;
2.根据 /etc/cron.d/0hourly 的设定,主动去 /etc/cron.hourly/ 目录下,执行所有在该目录下的执行文件;
3.因为 /etc/cron.hourly/Oanacron 这个脚本文件的缘故,主动的每小时执行 anacron,并呼叫 /etc/anacrontab的配置文件;
4.根据 /etc/anacrontab 的设定,依据每天、每周、每月去分析 /etc/cron.daily/, /etc/cron.weekly/, /etc/cron.monthly/内的执行文件,以进行固定周期需要执行的指令。

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

《鸟哥的Linux私房菜-基础篇》学习笔记

你可能感兴趣的:(操作系统,linux,运维,服务器)