工作排程
单一工作排程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编辑器,此时的格式是* * * * * 执行的任务
,五个*代表指定任务执行的时机。
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133128621-962034564.png)
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133134172-1955322934.png)
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133150621-144082253.png)
分钟数一般不能为*,否则代表每分钟都执行一次。
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
)
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133312918-922219572.png)
第一行指定了使用哪种shell;第二行重新定义了PATH;第三行的意思是例行性工作指令发送错误时,错误讯息会给root发一封邮件;重点的是设置例行任务的格式,在要执行的命令前多了一个用户名,代表执行命令的指令是以什么身份。
与例行任务有关的还有一个目录/etc/cron.d/*,开发软件时会把一些定时任务配置文件放入其中。
/etc/cron.hourly/、/etc/cron.daily/、/etc/cron.weekly/、/etc/cron.monthly/里面可以放一些脚本,系统会每小时、每天、每周、每个月自动执行。
资源不均问题
如果执行多个定时任务时可能会出现几个任务同时执行,使系统很繁忙,可以这样设置定时任务让多个任务错开执行:
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133333452-1835032310.png)
anacron程序
假如有一个备份的定时任务要深夜执行,但是却遭遇停电,重新启动linux后,如果还想让该备份任务执行而不是直接跳过,就要用到anacron。它可以处理因某些原因超过时间而没有执行的排程工作。
anacron会定期执行,而且会读取时间记录文件,查看上次执行anacron是什么时候,如果发现中断了一段时间,系统就认为定时任务没有执行,anacron就会开始执行未开始的定时任务。
anacron本质上是一个程序,默认一小时执行一次,该脚本在/etc/cron.hourly/0anacron,这个脚本内部会执行:/usr/sbin/anacron -s
这个命令,这个命令会根据配置文件的值执行一系列job。这个配置文件就是/etc/anacrontab:
![](https://img2020.cnblogs.com/blog/1742600/202003/1742600-20200321133351173-893885093.png)
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程序的方式执行。