本文基于Linux上CentOS 7版本进行演示
目录
一.单一执行例行性工作—at
1.单一执行例行性工作的含义、工作流程
(1)单一执行例性工作也就是在从此刻开始的未来某个时间执行某项工作,只执行一次,执行完毕后此任务的生命周期结束。
(2)开启atd服务后,/etc目录下存在若干个以"at."开头的文件,在执行at任务时,会先访问"at.allow"文件(可以不存在,也可以手动创建)确认哪些用户被允许执行at,再访问"at.deny"确认哪些用户被拒绝执行at,最后再执行命令行。
注意:"at.allow"和"at.deny"在用户有特殊需要时写入,如果两个文件都为空则默认所有用户都可以执行,当这两个文件都不存在时候则只有root用户可以执行at。
例:在今天16:35向已登录用户发送hello广播,命令输入完成后按"CTRL +d"结束。
[root@sulibao ~]# at 16:35
at> wall hello!
at> <EOT>
job 5 at Sun Jan 1 16:35:00 2023
2.at命令参数详解
格式:at 指定参数 指定时间
(1)参数
命令参数 | 参数说明 |
-m | 工作完成后(即使没有标准输出),给用户发送邮件 |
-l | 列出当前系统上面所有该用户的调度任务,等同于atq |
-d | 取消一个at调度任务中的工作,等同于atrm |
-v | 用较明显的时间格式列出at调度任务列表 |
-c | 列出某项调度任务的具体命令内容 |
-f | 从文件中读物调度任务 |
(2)时间格式
时间格式 | 格式说明 |
HH:MM | 默认是在今天的HH时MM分执行工作,如果这个时间今天已经过去则自动调度到明天这个时间 |
HH:MM Y-M-D | 规定在Y年M月D日的HH时MM分执行该工作 |
now+ x minutes/hours/days/weeks | 从此刻开始,经过x分钟/小时/天/周后执行该工作 |
二.循环执行例行性工作—crontab
1.循环性例行性工作的含义、工作流程
(1)循环例行性工作是指在未来的时间段按指定周期执行调度工作。
(2)crontab工作流程与at工作流程类似,判断完用户是否能执行crontab后再执行调度工作,使用crontab新建好调度任务后该任务被记录到/var/spool/cron中,同时使用crontab执行的工作可以在/var/log/cron日志文件中查找。
2.crontab命令参数详解
格式:crontab 参数
(1)参数
命令参数 | 参数说明 |
-u | 指定某个用户再进一步进行添加/删除调度任务,crontab -u 用户 参数,只能root用户执行 |
-e | 编辑crontab调度工作内容 |
-l | 查阅crontab调度工作内容 |
-r | 删除所有crontab调度工作内容 |
(2)编辑时按顺序的参数含义(共6个字段)
代表含义 | 分钟 | 小时 | 日期 | 月份 | 周中天 | 命令 |
取值范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7/0和7都表示周天 | 需要执行的命令 |
注意:各参数之间用空格分隔开
(3)编辑时可以使用的特殊字符
特殊字符 | * | , | - | / |
代表含义 | 任何时刻 | 用来分隔时段 | 表示范围 | 间隔频率,*/1就表示每一分钟执行一次任务 |
例:按要求规定crontab任务,在周一到周五的下午5点30提醒用户下课了。
[root@sulibao ~]# crontab -e
30 17 * * 1-5 wall Class is over!
[root@sulibao ~]# crontab -l
30 17 * * 1-5 wall Class is over!
三.系统执行例行性任务
1.系统执行例行性任务的流程
系统例行性任务通过修改/etc/crontab配置文件实现,crond服务读取文件内查找符合条件的内容进行执行,修改保存后即刻生效。
2./etc/crontab内参数解析
(1)已有参数信息
SHELL=/bin/bash:运行该任务的shell默认为bash。
PATH=/sbin:/bin:/usr/sbin:/usr/bin:在此指定执行命令的环境变量路径。
MAILTO=root:指任务执行信息将通过邮件发送给root用户。
[root@sulibao ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
(2)手动编辑参数信息
前5个字段和crontab -e的写法一样(空格隔开)
user-name:指定执行命令的用户
command to be executed:需要执行的任务命令行
[root@sulibao ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
例:每隔15分钟提醒各登录用户该喝水了
*/15 * * * * sulibao wall It's time to drink water!
Broadcast message from sulibao@sulibao (Mon Jan 2 13:23:01 2023):
It's time to drink water!
(3)当需要执行的任务有多个时,将任务放在目录里,利用run-parts指定任务目录
* * * * * root run-parts 任务目录