跳到主要内容

20、Linux 教程:工作排程

工作排程

单一工作排程at

atd服务

使用单一工作排程时必须先开启atd服务。

查看atd服务目前的状态:systemctl status atd

重新启动atd服务:systemctl restart atd

设置atd服务开机启动:systemctl enable atd

执行at的过程

当执行at指令时,会把工作以文本文件的形式写入/var/spool/at/目录下,该工作就会被atd服务调用并执行。

一般来说要对at的使用进行限制,因为黑客经常使用工作排程收集信息,为了限制at的使用,可以增加/etc/at.allow和/etc/at.deny两个文件,在执行at时会先找到/etc/at.allow文件,写在该文件中的使用者才能使用at,不在该文件中就不能使用at。如果/etc/at.allow文件不存在,则会查找/etc/at.deny文件,写在该文件的使用者不能使用at,否则就可以使用。如果两个文件都不存在,那么只有root才能使用at指令。

在一般的linux系统中,只会存在一个空的/etc/at.deny,意味着所有人都可以使用at指令。

at的用法

五分钟后执行任务:at now + 5 minutes

设置具体时间:at 23:00 2015-08-04

执行at命令后会开启at shell环境,用户可以在其中下达指令,这种状态下回车不会结束,按ctrl+d会结束命令输入。注意输入命令时要用绝对路径来下达指令,避免环境变量更换带来的问题。此外在at中下达echo命令不会在规定时间打印到控制台,这是因为at此时的环境与终端无关,所有的输出都会送到执行者的mailbox中,此时应该检查终端机的装置,把echo替换成echo "Hello" > /dev/tty1

在设置完at任务后,可以看见job的号码,执行at -c 2可以查看第2个job在执行时的一些附加指令内容,包括环境变量的设置等。

查看主机上多少at工作排程:atq,此时每行的第一个数字为工作号码

移除at工作排程:atrm 工作号码

背景执行与batch命令

at有一个很大的优点是背景执行,当远程连接到linux执行at任务时,即使连接中断也不会影响at任务的执行,这是因为at工作独立于当前的bash环境,直接交给系统的atd程序接管。

batch命令效果和at相同,不能加时间参数,而是在CPU工作负载小于0.8时,才进行你所下达的工作任务。相当于自动在系统空闲时执行任务。(工作负载是CPU所负责的工作数量)

系统定时任务crontab

系统中的crontab(cron/crond)服务是定时相关的,它是自动开启的,要使用定时任务必须确保其开启。

执行crontab的过程

和at命令一样,crontab也可以建立两个配置文件:/etc/cron.allow和/etc/cron.deny,前者比后者优先级要大,系统会默认建立一个/etc/cron.deny,执行crontab命令时会先检查这两个文件是否有执行权限。

当用户执行crontab时,工作内容就会记录到/var/spool/cron/里去,根据用户名的不同被记录到不同的位置,如abc用户的工作被记录到/var/spool/cron/abc中,这些文件都无法直接用vi编辑。可以经常检查一些这些位置,如果有来源不明的文件可能是感染了木马。

crontab的用法

crontab命令执行格式:crontab [选项],-e代表编辑crontab定时任务,-l代表查询crontab任务,-r代表删除当前用户所有的crontab任务。

进入编辑状态后可以编辑定时任务,相当于使用的是vim编辑器,此时的格式是* * * * * 执行的任务,五个*代表指定任务执行的时机。

 

 

 

分钟数一般不能为*,否则代表每分钟都执行一次。

10* * * *代表1点10分执行、2点10分执行。。。

星期几和几号同时出现时,只要一个满足要求就会执行。

常常用定时任务来执行脚本,但是注意当脚本中有date命令时:

date=$(date +%y%m%d)这个命令在定时执行时必须在%前加转义符:date=$(date +\%y\%m\%d),因为对crontab命令来说%有特殊作用。

通过命令删除定时任务时只能删除全部,不能删某个,此时要编辑定时任务来删掉对应命令。

其他配置文件

之前的/var/spool/cron/内部记录的是各用户的定时任务,如果要执行系统的例行性任务可以直接修改文件/etc/crontab,cron服务每分钟会检查/var/spool/cron/和/etc/crontab中的内容并执行。(有时也会遇到不能执行的情况,此时可以重启crond服务:systemctl restart crond

 

第一行指定了使用哪种shell;第二行重新定义了PATH;第三行的意思是例行性工作指令发送错误时,错误讯息会给root发一封邮件;重点的是设置例行任务的格式,在要执行的命令前多了一个用户名,代表执行命令的指令是以什么身份。

与例行任务有关的还有一个目录/etc/cron.d/*,开发软件时会把一些定时任务配置文件放入其中。

/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/里面可以放一些脚本,系统会每小时、每天、每周、每个月自动执行。

资源不均问题

如果执行多个定时任务时可能会出现几个任务同时执行,使系统很繁忙,可以这样设置定时任务让多个任务错开执行:

 

anacron程序

假如有一个备份的定时任务要深夜执行,但是却遭遇停电,重新启动linux后,如果还想让该备份任务执行而不是直接跳过,就要用到anacron。它可以处理因某些原因超过时间而没有执行的排程工作。

anacron会定期执行,而且会读取时间记录文件,查看上次执行anacron是什么时候,如果发现中断了一段时间,系统就认为定时任务没有执行,anacron就会开始执行未开始的定时任务。

anacron本质上是一个程序,默认一小时执行一次,该脚本在/etc/cron.hourly/0anacron,这个脚本内部会执行:/usr/sbin/anacron -s这个命令,这个命令会根据配置文件的值执行一系列job。这个配置文件就是/etc/anacrontab:

 

RANDOM_DELAY=45代表随机给予最大延迟时间是45分钟

START_HOURS_RANGE=3-22代表延迟3-22个小时执行任务

最下面三行代表每日、每周、每个月都要执行对应目录下的脚本,第一个数字是天数(超过1天就要执行每日任务,这代表每日定时任务因为某些原因被推迟了,超过7天就要执行每周任务。。)、第二个数字是延迟时间(决定执行定时任务后延迟5分钟后开始,避免刚刚开机任务密集)、第三个字段是任务名称、最后是实际执行的指令,代表执行对应文件夹下的全部指令。

以上述文件倒数第三行为例,anacron的大致执行流程如下:

1、 从/var/spool/anacron/cron.daily中取出最近一次执行anacron的时间戳,与/etc/anacrontab中的天数对比,如果超过就决定执行指令;

2、 根据/etc/anacrontab中的设置,要延迟3小时+5分钟执行每日任务;

3、 run-parts命令会在约5分钟内随机选一个时间执行/etc/cron.daily/中的全部任务;

综上所述,如果仅仅是执行crontab命令则不会执行错过的任务,但是如果把脚本放置在/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/下,就会在开机后主动执行,这也就是为什么开机一段时间后开始运行很多任务的原因,就是因为很多系统定时任务都是以anacron程序的方式执行。