跳到主要内容

11、Linux 实战:计划任务

计划任务

at和crontab的最小时间单位都是分钟

单一计划任务

at

at命令:编辑临时性执行任务

指令格式:at 选项 时间

任务命令 Ctrl和D

1)at中使用绝对路径来执行命令(或表达文档路径)

//at运行时,默认到当初执行at命令的工作目录下执行任务命令

2)at的执行与终端环境无关

//且所有标准输出/标准错误输出都会发送到执行者的mailbox中

选项 含义
-f 指定运行的Shell文件路径(无需指定任务命令)
-m 任务完成后即使没有输出,也会通过邮件通知执行者
-M 任务完成后不论有没有输出,都不通过邮件通知执行者
时间参数 含义
HH:MM 当天的HH:MM时刻执行 如:04:00 若指定的时间为过去的时间,则明天执行
HH:MM YYYY-MM-DD 指定在某年某月的某一天执行 如:04:00 2021-04-18
HH:MM [am|pm] [Month] [Date] 指定在某年某月的某一天执行 如:04am April 18
HH:MM [am|pm] + N [minutes|hours|days|weeks] 指定在HH:MM时间后的N时间单位执行 如:04pm + 5 minutes

//若表示当前时间可用“now”,如:now + 5minutes

如:在当前时间的五小时后列出/root目录下的文档
 

//执行at后会进入at shell环境中,可在 前输出多个任务命令,所以一个at命令下可有多个任务命令

指令格式2:at 选项

选项 含义
-l 列出当前主机上at任务列表
-c N 查看指定任务号N的具体内容
-d N 删除指定任务号N的at任务

//-l和-d选项分别和atq和atrm命令有相同的效果

如:查看6号任务的具体内容
 

atq命令:列出当前用户at的任务列表

指令格式:atq

1)若用户为root,则列出当前主机上所有at任务列表

如:查看当前主机at任务列表
 

//内容构成:任务号 执行时间 执行者

atrm命令:删除指定任务号N的at任务
指令格式:atrm N

如:删除7号任务
 

配置

at权限:通过黑、白名单限制用户设置计划任务的权限

(1)先查找/etc/at.allow文件(白名单,默认不建立),若存在该文件,则在该文件中的用户可使用at
//不在该文件中的用户都不可使用(即使不在/etc/at.deny文件也不可)

(2)再查找/etc/at.deny文件(黑名单,默认建立),在该文件中的用户都不可用at,而不在的用户都可使用

(3)若两个文件都不存在,则仅有root用户可使用at
1)编辑两个时文件(添加用户名)以行为单位,一行一个
2)白名单的优先级高于黑名单
3)默认允许所有用户使用at

at命令实现的本质是通过atd服务:at命令将任务命令以文本文件的方式写入/var/spool/at目录内,在指定时间时atd服务执行指定文件

1)并不是所有的Linux发型版都默认启动atd服务

2)atd服务可实现断网继续执行任务,因为系统默认将at任务独立出bash环境,直接交给系统的atd服务处理

batch命令:在系统有空时执行指定任务

指令格式:batch 选项

任务命令 Ctrl和D

1)用法同at,但不支持时间参数;且任务操作也属于at任务

2)系统有空:CPU的任务平均负载小于0.8时

//CPU负载指的是CPU单一时间所负责的任务数量(而不是CPU使用率)

循环计划任务

Linux系统就具有很多的循环计划任务,如:

1)执行日志文件的论循(logrotate)

//Linux系统会主动将系统运行时的各种信息都记录下来形成“日志文件”

2)日志文件分析logwatch的任务

//Centos中的logwatch会主动分析登录信息等,并发送Email给root

3)建立locate的数据库

//系统通过updatedb命令实现自动更新该数据库

4)manpage查询数据库的建立/更新

//通过系统计划任务自动建立/更新数据库

5)RPM软件日志文件的建立

//记录软件的安装、更新和修改等信息形成软件日志文件

6)删除缓存

//软件运行时会产生缓存,但该缓存在软件关闭后不会主动被删除

Linux就通过tmpwatch命令删除这些缓存1、

系统执行的循环计划任务数量与安装软件的多少有关

用户计划任务

crontab命令:编辑用户周期性执行任务

指令格式:crontab 选项

1)crontab中使用绝对路径来执行命令(或表达文档路径)

//crontab运行时,默认去对应的计划任务列表文件中查找

2)若不带任何选项,则默认直接编辑计划任务(类似at命令编辑形式)

选项 含义
-e 编辑计划任务列表
-u 指定用户 (若不指定,则默认为当前用户)
-l 列出计划任务列表
-r 删除计划任务列表

3)crontab执行的每一项任务都会被记录到“/var/log/cron”日志文件中

4)-r选项是将计划任务列表全部删除

//而删除某个计划任务则需通过-e选项进行编辑删除

5)编辑计划任务语法:以行为单位,一行即为一个任务

分时日 月 周 执行命令

如:计划每天的00:00系统自动重启
 

单位 取值范围
0~59
0~23
1~31
1~12
0~7 (0和7都表示星期天)

1)单位的取值必须为正整数

2)周与日不可同时设置,会导致周或日其中一个满足就开始执行

且分钟必须有数值(不能为空或“*”)

符号 含义
* 代表取值范围内的所有数字
- 链接两个数字,形成区间表达式 如:1至7为:1-7
/ 代表每间隔N个单位 如:每隔10单位执行一次:*/10
连接多个数字,形成多选值 如:选一三五为:1,3,5

如:设置当前主机的计划任务

每月1、10、22日的4:55重启network服务:

554 1,10,22 * * service network restart

每周六、日的1:10重启network服务

101 * * 6,0 service network restart

每天18:00至23:00之间每隔30分钟重启network服务

*/30 18-23 * * * service network restart

每隔两天的8:00至11:00的每第3分钟和15分钟执行一次重启

3,15 8-11 */2 * * reboot
 

配置

crontab权限:通过黑、白名单限制用户设置计划任务的权限

(1)先查找/etc/crontab.allow文件(白名单,默认不建立)

若存在该文件,则在该文件中的用户可使用crontab

不在该文件中的用户都不可使用(即使不在/etc/crontab.deny文件也不可)

(2)再查找/etc/crontab.deny文件(黑名单,默认建立)

在该文件中的用户都不可用crontab,而不在的用户都可使用

(3)若两个文件都不存在,则仅有root用户可使用at

1)编辑两个时文件(添加用户名)以行为单位,一行一个

2)白名单的优先级高于黑名单

3)默认是允许任何用户使用crontab

crontab命令实现的本质是通过crond服务:crontab命令根据指定用户名将计划任务命令以文本文件的方式写入/var/spool/cron/用户名(每个用户都有独立的文件)文件内,在指定时间时atd服务执行指定文件

1)所有的Linux发型版都默认启动crond服务

//因为Linux系统上具有很多周期性系统计划任务

2)不能使用Vim直接编译该文件,会导致语法错误(使crond不能执行)

其他计划任务

系统计划任务:通过编辑/etc/crontab文件实现系统计划任务

1)编辑方式同cronteab -e,但必须指定执行身份

2)/etc/crontab文件记录系统计划任务,且是一个纯文本文件
 
1)系统默认的计划任务是以root身份执行

2)crond服务的最低检测限制是分钟,crond会每分钟去读取一次/var/spool/cron

目录下和/etc/crontab文件中的所有数据内容

软件计划任务:通过配置/etc/cron.d目录实现软件计划任务

1)/etc/cron.d目录:放置crontab的配置文件脚本

//开发的新软件,若想拥有自己的计划任务,就需将该软件的计划任务配置文件放置到/etc/cron.d/目录下
 

run-parts脚本:在每小时的前5分钟内随机一个时间点去执行/etc/cron.hourly目

录下所有的执行文件,所以放置在/etc/cron.hourly目录的文件必

须是可被直接执行的命令脚本

/etc/cron.hourly目录:存放anacron相关的可执行文件

anacron

anacron程序:用于处理非24小时运行的Linux系统所执行的计划任务

以及一些超过时间而没被执行的计划任务

1)anacron属于程序和命令,不属于服务(不能使用服务命令管理)

2)anacron默认每小时会被crond执行一次

//且anacron默认以1天、7天和一个月为期去检测系统未执行的crontab任务

3)脚本文件/etc/cron.daily、/etc/cron.weekly和/etc/monthly都是被anacron调用的

//不依靠cron服务,且只需修改/etc/anacrontab文件就可实现不同效果

/etc/cron.hourly/0anacron:实现anacron每小时被执行一次的本质
 
//anacrontab前的“0”为实现cron.hourly目录下最先执行的文件使anacron的时间戳最先更新,防止出现时间参数误判

/etc/anacrontab:anacron的配置文件
 
内容构成:天数 强制延迟时间 自定义任务名称 实际任务命令

//天数的单位为“天”,最大随机延迟时间的单位为“分钟”

第一行:每天开机的5分钟后检查/etc/cron.daily目录下文件是否被执行

若当天没被执行,则计划执行该文件

第二行:每隔7天开机的25分钟后检查/etc/cron.weekly目录下文件是否被执行

若7天内都没被执行,则计划执行该文件

第三行:每隔1个月开机的45分钟后检查/etc/cron.monthly目录下文件是否执行

若1个月内都没被执行,则计划执行该文件

如:/etc/cron.daily的执行流程

1)读取/var/spool/anacron/cron.daily文件中anacron上一次执行的时间

2)读取时间与当前时间比较,若差值超过1天,就执行cron.daily

3)但cron.daily仅能在03:00~22:00时间段执行

4)执行时的强制延迟时间为5分钟,再随机延迟0~最大随机延迟时间(0~45)

5)使用nice命令指定默认优先级;再使用run-parts脚本执行/etc/cron.daily目录

下的所有可执行文件,执行完成后退出anacron程序

//同理/etc/cron.weekly、/etc/cron.monthly

anacron命令:处理执行时间到了却没有执行的计划任务

指令格式:anacron 选项

选项 含义
-u 更新记录文件的时间戳,但不执行任何任务
-s 根据/etc/anacrontab中设定的延迟时间顺序执行任务
-n 立即执行/etc/anacrontab中的所有任务,忽略所有延迟时间
-f 强制执行所有任务,忽略时间戳