计划任务

前言

在linux系统上,很多任务都是临时启动执行的,但是也会存在计划安排的任务。比如说按照提前设定好的时间发送一封邮件,每天对服务器大的登录日志进行检查,并且筛选出异常的登录记录使用邮件发出提醒系统管理员及时处理。这些功能都需要相关的命令实现。

计划任务分类

计划任务分为两类,一种是例行性的,即每个一段时间就执行一次任务;另外一种是突发性的,即执行一次就不再执行的。

例行性的任务可以使用crontab;突发性的任务可以使用at。

Linux常见的例行性任务

  • 登录日志文件的轮替:Linux系统会把系统所发生的各种信息都记录下来,记录在登录日志中。由于一直记录登录信息,会导致文档所占容量越来越大,同时会导致读取和处理文档越困难,因此需要定期将登录日志文件移到其他地方保存,新旧登录日志分开存储。
  • 登录日志分析:系统管理员需定期对登录日志进行分期可以及时发现系统存在的安全威胁,这些威胁包括不限于硬件错误、软件错误和资料安全问题。而周期性的工作更适合使用例行性任务去完成。
  • 查询资料库的建立更新
  • RPM登录档建立
  • 移除暂存档:有些软件关闭后还存在一些未清理的失效临时缓存文件,可以定时执行tmpwatch清除临时文件。
  • 与网络服务有关的分析行为:在网站服务器上,linux会主动去分析网站服务的登录日志。

突发性计划任务(at)

突发性计划任务使用at即可实现突发性计划任务。

at的工作方式

at创建的突发性计划任务都是使用使用文字记录到/var/spool/at/目录下,等待atd服务去读取并在指定时间执行任务。

/var/spool/at目录下的文件

安装at

在某些版本的linux系统(centos最小化安装)中,可能未安装at。centos中使用yum install -y at安装at。

开启at服务

想要正常使用at,还需要启动at的服务,名称为atd。重启服务使用systemctl restart atd;开机启动服务systemctl enable atd;查看服务的状态systemctl status atd

查看服务状态

at的基本使用

首先说明一下at使用权限的问题:

  • 当不存在/etc/at.allow和/etc/at.deny配置文件时,只允许root使用;
  • 当只存在/etc/at.allow配置文件时,只有该文件中的用户可以使用at;
  • 当只存在/etc/at.deny配置文件时,该文件中的用户不可以使用at,其余用户都可以使用;
  • 当/etc/at.allow和/etc/at.deny配置文件都存在时,以/etc/at.allow为准。
at [-f file] [-mMlvd] time
## 参数解释
-f 后接文件,指定从文件中读取计划任务内容;
-m 任务完成时发送邮件给用户;
-M 任务完成时不用发邮件给用户;
-l 功能等同于atq
-v 显示任务被执行的时间
-d 功能等同于atrm
#### 注意:at中下达命令最好通过
#### at的执行权限问题:当不存在/etc/at.allow和/etc/at.deny文档时,只允许root使用;
####    当只存在/etc/at.allow文件时,只有该文件中的用户可以使用at
####    当只存在/etc/at/deny配置文件时

time的时间格式
    HH:MM    今天的HH:MM执行任务,若已经超过该时间,则明天执行;
    HH:MM YYYY-MM-DD 指定年月日时间执行;
    HH:MM[am|pm] [Month] [Date]    指定某年某月某日指定时间执行;
    HH:MM[am|pm] + number [minutes|hours|days|weeks]    指定某个时间之后的某个时间点执行。
    使用较多的是使用"now+时间间隔"的方式指定时间。

at -c 工作号码
## 用于详细列举任务的工作内容。

atq
## 列举所有计划任务工作。

atrm 工作号码
## 删除指定计划任务工作


batch
## 系统空闲时执行计划任务,当系统工作负载小于0.8时可以执行

at使用示例

5分钟后向当前终端输出字符串

由于at在执行时标准输出和错误输出都不会直接输出到终端,因此需要使用重定向将输出重定向于终端。

首先查询目前使用的终端,使用命令who am iwho或者w即可查询到目前使用的终端。

查询目前使用的终端,pts/0

利用at实现五分钟后向当前终端输出字符串,命令at now + 5 minutes,输出到当前终端的命令为echo "hello" > /dev/pts/0

at实现五分钟后输出字符串

利用batch实现系统空闲时执行向当前终端输出字符串

在本实验中使用bc计算100000位pi的值占用cpu来模拟系统负载大,计算100000位pi值的命令为echo "scale=100000; 4*a(1)" | bc -lq &(若提示未安装bc,则使用yum install -y bc安装),使用3个线程同时计算以确保系统负载较大(若计算机性能较好,则可以适当增加个数)。然后命令行使用batch进入计划任务编辑,输入指令echo "hello" > /dev/pts/0

使用batch设置计划任务

可以使用atq或者at -l命令查看计划任务列表,使用atrm 工作号码或者at -d 工作号码删除计划任务。

使用atq和atrm

例行性计划任务(crontab)

例行性计划任务是每隔一定的时间就需要执行的任务,需要多次执行该任务。

crontab运行原理

crontab -e可以编辑cron任务的内容,任务格式如* * * * * echo "hello",”:wq”保存并退出crontab任务编辑,实际以文档的形式存放在/var/spool/cron路径下,通过用户划分不同文档保存,需要注意:不建议直接编辑/var/spool/cron下的计划任务文档。cron计划任务是通过crond服务实现的,crond服务每分钟会检查/var/spool/cron满足执行条件的任务并执行。

crontab计划任务存储位置

  • /var/spool/cron/* ps:该位置是由个人用户使用crontab -e命令编辑计划任务保存的,保存到名称为用户名的文档中;
  • /etc/crontab ps:该位置存储的是系统的计划任务,如:定期维护系统的脚本等;
  • /etc/cron.d/* ps:该位置的文档也是和系统的运行有关,可以将一个软件的计划任务文档直接放置在该路径下即可生效,更新脚本可以直接覆盖即可。

crontab权限管理

crontab的执行权限与at类似,通过/etc/cron.allow和/etc/cron.deny控制,且/etc/cron.allow的优先级高于/etc/cron.deny。当cron.allow和cron.deny都不存在时,只有root能使用;当有cron.allow存在时,只有写入文档中的用户可使用;当只有cron.deny存在时,写入文档中的用户都不可使用。

crontab的基本用法

crontab [-u user] [-l | -r | -e | -i]
## 参数解释
-u 帮助其他用户管理crontab任务,后接用户名;
-l 列举出crontab任务;
-r 删除用户所有crontab任务;
-e 编辑用户的crontab任务

## crontab任务格式
* * * * * echo “hello” > /dev/pts/0
#分 时 日 月 星期 命令

以下为crontab例行性任务设置格式,使用命令crontab -e进入例行性任务编辑命令行,按照格式即可添加例行性任务,以下为各参数的数值范围:

代表含义 分钟 小时 日期 月份 指令
数值范围 0-59 0-23 1-31 1-12 0-7 例行任务的指令

特别需要注意的是周设置中0和7一样表示周日,且周与日月设置不能同时共存。在设置过程中还涉及到使用一些特殊的符号,其所表示的意义如下表所示:

符号 含义
*(星号) 表示接受任何值
,(逗号) 表示接受多个值,中间使用逗号分隔
-(减号) 表示值的范围,4-6表示4、5、6这3个值
/n 表示能被n整除的值

注意在/etc/crontab中的计划任务在周之后指令之前需要添加指定执行任务所使用的用户。且在/etc/crontab的前三行分别指定使用何种shell执行、执行时的PATH路径和额外的输出使用时谁接收邮件。

/etc/crontab内容

以以下几个命令讲解基本用法:

  • * * * * * echo "hello" > /dev/pts/0 *表示任意值都满足,那么说明任何时间都能执行任务,由于crontab是由crond服务每分钟调用实现的,那么这条命令则表示每分钟输出一次”hello”到/dev/pts/0终端中。
  • */5 6,7 * * 1-5 echo "hello" > /dev/pts/0这条命令中可以看出,分钟使用*/,表示分钟为5的倍数时满足条件,即0、5、10、15……;小时部分使用6,7表示小时为6和7都满足条件;日和月使用*,表示任何日月都满足条件;周使用1-5表示星期一到星期五都满足条件。所以综合上述分析,这条命令表示的是周一到周五每天早上6时至8时两个小时期间每5分钟向/dev/pts/0终端输出”hello”。

修改或者删除crontab任务

如果该用户的所有的计划任务都需要删除,则可以直接使用命令crontab -r清除,若只是删除部分任务则需要使用crontab -e将对应的crontab任务行删除即可。

crontab实例

这里使用每分钟都向当前终端打印出当前的时间,使用crontab -e进入crontab任务编辑界面,输入crontab指令* * * * * date > /dev/pts/0

设置crontab计划任务

保存退出后,系统之后的每一分钟都会在当前终端中打印出当前时间。

每一分钟在终端中打印当前时间

crontab使用注意事项

使用crontab时需要注意的是,在不同的使用情况是crontab任务放置的位置是有所差别的。如果是个人用户的需求时,应该使用crontab -e来创建任务;如果关于系统维护管理方面的需要求,可以将任务放置到/etc/crontab中;如果是开发的软件需要,则应该放置在/etc/cron.d目录下。

除此之外在设计计划任务时需要注意将任务错开执行,避免一起执行导致资源分配不均。

anacron

anacron与crontab存在很大的不同。两者都是和计划任务有关,但是crontab的作用是用于7*24小时开机的服务器,而anacron的作用是用于非7*24小时开机的服务器。anacron的实现也是通过crontab实现的,使用crontab每小时调用一次crontab去检查未执行的计划任务。当计划任务超过规定的延期时间,则安排执行计划任务。

anacron实现方式

anacron是一个可执行的软件,存放在/sbin/anacron,且只有root用户具有执行的权限。anacron的调用与at和crontab的服务调用不同,是通过crontab计划任务定时调用的,存放在/etc/cron.hourly/0anacron,内容如下:

anacron调用脚本0anacron

在/etc/cron.hourly/0anacron配置文件中,首先指定了执行的shell:/bin/sh。接着第一个if判断使用test判断/var/spool/anacron/cron.daily文件是否存在且可读,并读出cron.daily文件中存储的日期(这个日期是上次annacron执行的日期),第二个if用于判断今天的日期是否等于记录的日期,若已经执行过anacron则退出脚本,第三个if主要是对电源的判断。最后anacron -s表示检查关机期间未执行的计划任务并且安排执行。

/var/spool/anacron/cron.daily内容

当执行anacron程序时,检查的/etc/anacrontab配置文档:

/etc/anacronrtab内容

SHELL:指定执行命令使用的shell工具;

PATH:指定执行该脚本使用的默认PATH路径;

MAILTO:指定邮箱通知收件人;

RANDOM_DELAY:指定最大的随机延迟时间;

START_HOURs_RANGE:指定执行anacron的时间,这设置的时间是3:00~22:00;

period in days:表示超期天数,即anacron执行的时间与之前执行的时间的差值大于此值时执行该任务,如1,则上次执行anacron的时间与此次执行相差2天则说明目前该任务已经超期,则需要执行该计划任务;

delay in munites:表示延迟时间,即安排执行时延迟时间执行,5表示延迟5分钟之后执行;

job-identifier:表示任务标识符,即任务的名称,一般与目录名称相同;

command:当满足之前的条件要求时需要执行的指令;

符号 含义
@hourly 每小时一次
@daily 每天一次(凌晨)
@weekly 每周一次(周日凌晨)
@monthly 每个月一次(月初凌晨)
@yearly 每年一次(年初凌晨)
@reboot 重启执行

run-parts命令用于执行当前目录下所有脚本。

注意:anacron使用的时间戳保存在/var/spool/anacron/目录下,且命名为任务的名称。

anacron时间戳保存路径

anacron基本使用方法

anacron [-s] [-f] [-n] [-d] [-q] [-t anacrontab] [-S spooldir] [job]
## 参数解释
-s    开始连续执行一系列工作,跳过已经执行过或者未超期的工作;
-f    不管任务之前是否执行都需要执行;
-n    立刻执行未进行的工作,不延迟执行;
-d    不后台执行anacron任务,直接输出执行信息到标准错误输出;
-q    禁止输出任何信息到标准错误输出,只与-d搭配使用;
-t    使用指定的anacrontab配置文件而不是使用/etc/anacrontab配置文件;
-S    使用指定的spool dir以存储anacron的时间戳,默认的时间戳位置为:/var/spool/anacron/cron.daily;
job    由anacron配置文件定义的各项工作的名称。

anacron -u [job]
## 仅更新时间戳记录,不做任何操作

anacron使用注意事项

  • 想要脚本受支持anacron只需要将脚本放入/etc/cron.daily/、/etc/cron.weekly/或者/etc/cron.monthly/路径下,且注意该上个路径下的脚本都不能是定特定的时间执行,系统会按照天、周或者月为周期调用脚本执行。
  • 需要注意的是anacron与cron的不同,anacron本身不支持计划任务,以cron实现的能使非7*24小时开机的服务器能即使执行在关机期间未执行的任务。
  • anacron一般是一天运行一次,从而也可以照顾到一周和一个月的计划任务的超期执行。

参考资料

on_ac_power:https://linux.die.net/man/1/on_ac_power

run-parts:https://www.commandlinux.com/man-page/man8/run-parts.8.html

nice:https://linux.die.net/man/1/nice

鸟叔的linux私房菜:http://linux.vbird.org/linux_basic/0430cron.php


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 qinzhtao@163.com

文章标题:计划任务

文章字数:3.8k

本文作者:捌叁壹伍

发布时间:2020-02-18, 16:06:16

最后更新:2020-02-24, 16:33:54

原始链接:http://qzt8315.github.io/2020/02/18/计划任务/

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏