例行工作排程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为例

  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 程序结束。

anacron语法:

在这里插入图片描述
/etc/cron.hourly脚本中最后一句为/usr/sbin/anacron -s,就是执行未进行的排程工作的指令

5. 重点梳理

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yueguangmuyu/article/details/108731815