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

2023-12-05

例行性工程

听谓的排程是将工作安排执行的流程之意。
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都预设会把他打开的,所以呢,某些时刻必须要手动将他启用才行。
在这里插入图片描述

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 工作号码

在这里插入图片描述 事实上,当我们使用 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]

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

辅助字符:
在这里插入图片描述

系统的配置文件:/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】

在这里插入图片描述
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。
在这里插入图片描述

anacron 的语法:

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

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

anacron 的配置文件,/etc/anacrontab 的内容:
在这里插入图片描述
在这里插入图片描述
天数: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私房菜-基础篇》学习笔记

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux(13):例行性工作排程 的相关文章

随机推荐

  • 【论文阅读】【三维场景特殊点云分割】OpenMask3D:Open-Vocabulary 3D Instance Segmentation

    前言 NeurIPS2023 OpenMask3D Open Vocabulary 3D Instance Segmentation 论文地址 https openmask3d github io static pdf openmask3d
  • 4. 统计描述和基线表格绘制

    目录 1 连续型变量统计描述 单变量统计描述 1 summary函数 2 psych包中的describe 函数 3 Hmisc包中的describe 函数 4 pastecs包的stat desc 的函数 分组统计描述 1 doBy包的s
  • 虚函数不能声明为static

    虚函数申明为static报错 class Foo public Foo default static virtual Foo int main Foo foo return 0 main cpp 10 25 error member Foo
  • 《算法通关村——滑动窗口高频问题之**寻找子串异位词**》

    算法通关村 滑动窗口高频问题之 寻找子串异位词 567 字符串的排列 给你两个字符串 s1 和 s2 写一个函数来判断 s2 是否包含 s1 的排列 如果是 返回 true 否则 返回 false 换句话说 s1 的排列之一是 s2 的 子
  • GPT4-Turbo技术原理研发现状及未来应用潜力分析报告

    今天分享的是GPT4 Turb系列深度研究报告 GPT4 Turbo技术原理研发现状及未来应用潜力分析报告 报告出品方 深度行业分析研究 报告共计 46页 图像理解能力提升 三大视觉学习方法 为打造视觉大模型 建立高效视觉预训练体系以提升图
  • AntDesign去国际化 | router页面显示问题

    删除 Ant Design Pro 中的 国际化 模块报错 Environment key es2022 is unknown 问题描述 使用 npm run i18n remove 运行 i18n remove pro i18n remo
  • OpenWrt开放端口

    背景 安装了OpenWrt 想要从外部访问内部的某些端口 发现并不能够访问 如Open clash的代理端口 及时在clash中打开允许访问 但是仍然不行 其他方法 网络上看到的方法都是在命令行中操作 或者将命令添加到开机命令中 方法 端口
  • 鼎捷输配电电子组装行业数字化转型方案出炉,3个方向解决7大痛点!

    近年来 随着经济的高速发展 我国全社会用电量快速增长 用电总量位居全世界第一 在 双碳政策 新基建 等多个产业政策的支持下 新型电力系统和特高压建设的推进下 释放巨大的输配电设备升级换代市场需求 促使输配电电子组装行业产值逐年增加 数据显示
  • 华为认证 | HCIP和HCIE差别很大吗?

    根据ICT从业者的学习和进阶需求 华为认证分为 工程师级别 高级工程师级别和专家级别 三个认证等级 分别就是 HCIA HCIP以及HCIE 这三个级别中 HCIA作为一个比较入门级别的考试 选择的人比较少 大多数小伙伴可能会 更关注HCI
  • 如何保持操纵机构丝杆的精度?

    滚珠丝杆是操纵机构中的重要组成部分 可以传递较高的扭矩 并且具有低摩擦 高效率和快速响应的特性 这使得操纵机构能够实现高速 高精度的运动控制 这对于整个系统的性能和精度具有决定性的影响 保持操纵机构丝杆的精度是确保整个系统正常运行的关键 那
  • RflySim | 姿态控制器设计实验一

    姿态控制器设计实验1 一 姿态控制设计简介 本文是建立在多旋翼的姿态即控制器中的反馈信号能够被较好地估计的前提下 控制器中的反馈信号是估计值 不过 为了更加简便根据分离原理 我们用真值代替反馈信号 本文的目的是让多旋翼的姿态能够跟随我们给定
  • Sequential Modeling Enables Scalable Learning for Large Vision Models

    目录 一 论文速读 1 1 摘要 1 2 论文概要总结 二 论文精度 2 1 论文试图解决什么问题 2 2 论文中提到的解决方案之关键是什么 2 3 论文提出的架构和损失函数是什么 2 4 用于定量评估的数据集是什么 代码有没有开源 2 5
  • AI大模型专题:北京市人工智能行业大模型创新应用白皮书

    今天分享的是人工智能系列深度研究报告 AI大模型专题 北京市人工智能行业大模型创新应用白皮书 报告出品方 北京市科学技术委员会 中关村科技园区管理委员会 报告共计 72页 海量 完整电子版 报告下载方式 公众号 人工智能学派 综述 作为新一
  • 学生犯错误老师应该怎么教育

    作为一名老师 当学生犯错误时 我们需要采取一些措施来帮助他们改正错误并学习如何更好地处理问题 以下是我作为一名老师会采取的几个步骤 进行私下谈话 了解他们为什么犯错误 我会听取他们的解释 并尝试理解他们的动机 这样做可以让我更好地了解学生的
  • 允许root远程连接数据库

    开放root远程连接数据库的权限 Linux系统 环境 centos7 关闭防火墙 没关要开放数据库的端口 一 进入数据库 查看权限表信息 MariaDB none gt use mysql Reading table informatio
  • 为什么最近听说 Go 岗位很少很难?

    大家好 我是煎鱼 其实这个话题已经躺在我的 TODO 里很久了 近来很多社区的小伙伴都私下来交流 也有在朋友圈看到朋友吐槽 Go 上海的大会没什么人 还不如 Rust 大会 比较尴尬 今天主要是看看为什么 Go 岗位看起来近来很难的样子 也
  • 计算机组成与设计:硬件/软件接口,第三章详细梳理,附思维导图

    文章目录 三 计算机的运算 章节导图 一 整数的表示 无符号整数 原码 反码 原码是带符号整数的表示方法
  • Liunx常用基础命令

    目录 liunx常用命令基础 1 cd命令 2 ls命令 3 pwd命令 4 touch命令 5 head命令 6 cat命令 7 more命令
  • 网络安全日报 2023年12月04日

    1 研究人员披露Lazarus组织已窃取价值30亿美元加密货币 https go recordedfuture com hubfs reports cta 2023 1130 pdf 至少自2017年以来 来自朝鲜的Lazarus组织越来越
  • Linux(13):例行性工作排程

    例行性工程 听谓的排程是将工作安排执行的流程之意 Linux 排程就是透过 crontab 与 at 这两个东西 两种工作排程的方式 一种是例行性的 就是每隔一定的周期要来办的事项 一种是突发性的 就是这次做完以后就没有的那一种 at at