目录 :
基础概念
单一执行的例行性工作
循环执行的例行性工作
基础概念 :
概念导入 :
# 什么是例行性工作 ?
直接理解就是 :在某一个时刻需要执行的事情。
某一个时刻 : 就是在未来的某一个时间点
再举个例子 : 就像我们每到期末就得考试。像是一个定时任务,举例闹
钟,你今天晚上定一个明早八点的闹钟,这就是例行性工作
# 例行性工作的分类 :
正如目录中看到的,例行性工作分为 单一性和循环性 例行性工作。
依旧拿闹钟举例来区分这俩区别 :
我们在定闹钟的时候,也就分为两种闹钟 :
一种是 只定明天早上八点钟的闹铃,也就是明天响过就不再响了
是一种临时的闹钟,只在明天早上起作用,响一次就结束了。
一种是周一至周五早上八点的闹钟,就是在周一到周五的每天八点都会响
一遍,周一到周五这个循环内都会响。
因此第一种就是单一执行的例行性工作,第二种就是循环执行的例行性工作。
单一执行的例行性工作 :
操作命令 : at 和 atd
注 :首先, at 是命令,atd 不是命令是 “ 服务 ” at 命令对应的是 atd 的服务
官方 : 我们使用 at 命令来生成所要运行的工作,并将这个工作,以文本方
式写入 /var/spool/at/ 目录内,该工作便能等待 atd 这个服务的取用
与执行了。
简单理解 : at 命令主要是制造这个例行任务,真正执行的是 atd 服务 在执行 。
# : 结合官方的解释,在我们进行例行性工作过的时候,我们需要注意两
个点 :
第一个 : 使用 at 命令去配置的时候,注意看 atd 服务会不
会去执行这个服务(结果当然是 要执行的 )
第二个 : 在 atd 服务执行后,注意看 /var/spool/at/ 这个目
录下有没有对应的内容。
安全问题 : 即不是所有人都可以进行 at 工作调度。 我们可以利用 /etc/at.allow 和
/etc/at.deny 这两个文件来进行 at 的使用限制。
# 这里的安全问题说白就是有一个限制,即类似黑名单,白名单的限制,你在
黑名单里那你就不能使用 at 命令,你在白名单里才可以使用 at 命令!!
# /etc/at.allow 即: 白名单 名单里的用户即可以使用 at 命令
/etc/at.deny 即 : 黑名单 名单里的用户不能使用 at 命令
# 我们来看看这两个目录下的内容 :
注 : 我们可以发现在系统默认下,只有一个目录就是 : /etc/at.deny 这一个
目录,也就是说只要在这个目录下的用户是不可以使用 at 命令的,不
在这个目录下的用户就可以使用 at 命令。
我们查看这个目录,发现目录下什么东西都没有,也就是说目前,都
可以使用 at 命令。
at 命令详解 :
# 命令格式 : at [ 选项 ] [ 时间 ]
相关参数 :
选项 | 说明 |
-m | 当任务完成之后,即使没有标准输出,将给用户发送邮件 |
-l | atq的别名,可列出目前系统上面的所有该用户的at调度 |
-d | atrm的别名,可以取消一个在at调度中的工作 |
-v | 使用较明显的时间格式,列出at调度中的任务列表 |
-c | 可以列出后面接的该项工作的实际命令内容 |
-f | 从文件中读取作业 |
# 时间格式 :
时间 | 说明 |
HH:MM | 在今天的HH小时MM分钟执行,如果今天的这个时间点已经过了,则明天执行 |
HH:MM YYYY-MM-DD | 强制规定在某年某月的某一天的特殊时刻进行该工作 |
now + 2 minutes | 从现在开始几分钟minutes, hours, days, or weeks |
举例示意 :
1. at 10:45
(代表的就是在今天的10点45分执行任务,如果时间点已过,那
么,明天的10点45再执行)
2. at 3:30 AM 08/01/2022
( 表示 : 在2022年8月1日 上午 3点30 执行任务)
3. at now + 2 minutes
( 表示 : 从此刻起的两分钟后)
at now + 3 hours
( 表示 : 从此刻起的三小时后)
at 3:30 AM tomorrow
( 表示 : 在明早3点半 )
# 显然可以看到 上示中有几个当中在表达事件的时候是有 +号的;
所以 + : 它表示的是 相对于现在,即相对于此时此刻。
实例演示 :
任务 :
# 设置一个 三分钟后的闹铃
[root@localhost ~]# at now + 3 minutes # 这一行是 在 3分钟后 at命令来配置 atd服务
warning: commands will be executed using /bin/sh
at> echo "didididi..." > /root/at_alram # 这行 是 atd 执行的服务的内容 即3分钟后要执行的内容
at> <EOT>
job 15 at Mon Aug 1 10:48:00 2022
[root@localhost ~]#
上示内容即设置成功,然后,只需要等待 3 分钟去查看结果即可。
注 :关于在执行命令时需要知道的一些操作
# 关于删除 (就是比如在命令行中输入内容结果输入错了,想删掉,重新写)
请看示例 :
请注意黄色圈着的内容 : 这是—— 我想输入 “didididi..." 结果多按了1234,然
后我想要把 1234 删除,就按下 我们最常用的删除
键(就是键盘上我们横排123456...数字键的那一行
的最后一个按键)
结果就是 : 每按下一个删除键就会 显示出一个黄
色圈的内容。
这就说明我们的删除键并不是传统意义上的删除键。
删除键为 : ctrl + 删除键 (传统意义的删除键)
# 关于命令执行
[root@localhost ~]# at now + 3 minutes
warning: commands will be executed using /bin/sh
at> echo "didididi..." > /root/at_alram # 到这一步,其实我们的命令已经改写的都写好了,那怎么执
at> # 行所写的命令呢?? 按 Enter 键嘛??
at> # 按 Enter 键出来的结果还是 at>
所以当我们把命令该敲得都已经敲了,怎么执行命令呢?
执行命令键 : Ctrl + D
任务结果 :
[root@localhost ~]# ls
anaconda-ks.cfg at_task2 Desktop Downloads Music Public Videos
at_alram cd Documents initial-setup-ks.cfg Pictures Templates
# 可以看到在 根目录下生成了 at_alram 文件
[root@localhost ~]# more at_alram
didididi...
# 查看 at_alram 文件 查看后发现就是我们在 atd 服务执行的内容,即说明我们的例行性工作执行成功。
# 任务结果就是 在 3 分钟后执行了我们的任务 : didididididi.....
除了使用 ctrl + D ( 这种交互式 执行命令 ) 还有一种方式来执行
===>>>
就是使用 管道符 ( | )
echo " echo 'hello again ' >> ~/at.txt | at now + 1 minute
注 : at 命令只会执行一次,因为它是 一次性计划任务呀,就你设置的这个任务,
它一执行就结束了,就不会再有这个任务了~!!!
所以,它只执行一次。
循环执行的例行工作
先导 : 循环例行性工作调度是由 crond 这个系统服务来控制的。
操作命令 : crond 和 crontab
注 : crond 命令是来 执行例行性工作的, crontab 是来编辑的。
安全用户 : 与 单一执行例行工作相似, 循环例行工作也有安全用户,也有对用户
的限制,在有的文件里出现的用户则是不可以使用 crontab 的。
/ etc / cron.deny 里的用户不可以 使用 crontab 。
记录 :
# 当用户使用 crontab 新建工作调度之后,该项工作就会被记录到
/var/spool/cron 里面
# cron 执行的每一项工作都会被记录到 /var/log/cron 这个日志文件中去
crontab :
命令格式 : crontab [ -u uesr] [ -l | -r | -e ]
参数详解 :
参数 | 说明 |
-u | 只有 root 才能进行这个任务,帮助某个用户 新建/删除 crontab |
-e | 编辑 crontab 的工作内容 |
-l | 查阅 crontab 的工作内容 |
-r | 删除所有的 crontab 的工作内容 |
注 :
- u : 你可以为自己设置任务,但是如果要帮别人(指用户)
设置任务(新建或删除),你就必须是管理员用户才可以。
-u 后面的 user 指的就是 要帮别人(用户) 的那个用户。
- e : 说明里面解释的是 “ 编辑 ” 编辑 就包含了 删除 和 添加 。
下面的 -r 是指删除所有,而 -e 的删除 就是可以删除某
一个工作内容!!!
crontab -e :
注 : 上示命令即是 要进行 编辑 任务的命令选项(-e)
上示命令输完后,会出现一个编辑器(就跟 vim编辑器 几乎一样)
当你编辑完之后必然要进行保存,那么,保存到哪里去了呢?
保存到 : / var / spool / cron 里面去了。
我们想要进行的 循环例行性工作 就是在上示里进行编辑的,那么,
在上示里面我们是怎样编写 工作内容的呢? 格式又是怎样的呢?
文件格式 : 每一行为一个工作,每项工作具有六个字段
代表意义 | 分钟 | 小时 | 日期 | 月份 | 周 | 命令 |
数字范围 | 0-59 | 0-23 | 1-31 | 1-12 | 0-7 (0和7代表的都是周日) | 执行的命令 |
注 : # 我们表达 循环周期 就必须要用到上示 五个时间字段;
这五个字段在编辑时必须要带齐;
# 前五个(分钟 - 周) 代表的是循环的周期,后一个字段(命令)
代表的是执行的命令(也就是要执行的任务)
# 日期 : 指的是月中天 ( 每月里的哪一天 )
# 周 : 也就是 星期几 ; 它是完全独立于前面几个时间字段的。
因为每月都有好几个 周一、周二。。。等等
注 : 在我们编辑任务的时候,自然必须要写 这五个时间字段,
关于这五个时间字段需要注意的是 : 日期(月中天)和
周(星期几) 一般是不同时用的; 也就是上示注释“周”里
的那句话说的那样 : 周是完全独立于前面几个字段的。
所谓独立就是 : 主要还是不与 日期(月中日) 同时 使
用。 因为 日期(月中日) 很纯粹 ,一个月就那么多天,
每天都是不重复的,7月1日 就是指的 7月1日,8 月16 就
是指的 8月16 , 因为你绝对不可能在 7 月找到 两个 1
日,你也不可能在 8月找到 两个 16 日,但是,反观 周
(周几)在一个月里可是有很多个 周一,周二,周三,周
四。。。。等等的,这就造成了 同一个月中 都是 星期
一, 却对应有好几个日期。 综上 : 一般不同时使用日
期(月中日) 和 周(星期几)
编辑中的特殊字符 :
特殊字符 | 含义 |
* | 代表任何时刻 |
, (逗号) | 代表分隔时段 |
- | 代表一段时间范围 |
*/ 数字 | 指定时间的间隔频率,例如每3分钟进行一次, */3 |
注 : # * : 代表任何时刻 即 :
在分钟字段下 * 就代表 每一分钟
在小时字段下 * 就代表 每一小时
在日期字段下 * 就代表 1-31 日中的每一日
在月份字段下 * 就代表 1-12 月 中的每一月
在 周 字段下 * 就代表 周一 至 周日 的每一日
# , : 主要就是用来分隔,时间可以是连续也可以是间断的。
比如 :
在分钟字段下 : 16,17,19 指的就是 16 ,17,19 分钟
显然是间隔两分钟。
16,17,18 这里的时间是连续的。
总之 : , 可以用连续的时间,也可以用于间隔的时间
# - : 它主要是用来表示连续的时间。
比如 : 现在我要布置一个明早 六点至八点的任务
那就在小时字段下 : 6-8
注意 : 六点到八点 这是连续的时间,我们就可以用 - ,
但是,我们刚才学了 , 因此 六点到八点除了使
用 - 我们也可以使用 , 表示为 : 6,7,8
# /数字 : 它的意义在于 时间间隔的频率 ,所谓频率就是指的表格里
的 含义 : 每隔多少分钟; 每隔多少小时,每隔多
多少日 ; 每隔多少月 。
分钟 和 小时 经常用, 日 和 月很少用。
注 : 每隔多少 (分,时,日,月)编辑的时候就在对应
的字段下面进行编辑。
在分的字段下编辑就代表 每隔多少分钟。其它同理
注 : 格式虽然为 / 数字 但是在编辑的时候 前面要加 *
即 : * /
时间练习 : 只练习时间部分,命令部分不练习。
# 每小时执行,每小时的整点执行
00 * * * *
# 每周执行, 每周四的凌晨 2 点 1 分执行
1 2 * * 4
# 每月执行,每月的 3 号 的 下午2 点 1分 执行
1 14 3 * *
# 每周 3 和 周 5 的 2 点 1分执行
1 2 * * 3,5
# 每年执行, 每年的 4 月 3 号 的 凌晨 2 点 1 分 执行
1 2 3 4 *
# 每周六、日 下午 的 1 点 2 点 的每一分钟都执行
* 13,14 * * 6,7
# 周一到周五的每天早上 9 点 一直到 下午 6 点 的每一个整点
(工作日的每个小时整点)
00 9-18 * * 1-5
# 每隔 10 分钟 执行一次任务
*/10 * * * *
# 每天的凌晨 3点半 和 12 点半 执行任务
30 3,12 * * *
# 每隔 6小时 ,执行任务
00 */6 * * *
# 每天晚上 9 点 30 重启 nginx
30 21 * * * /usr/bin/systemctl restart nginx
# 每月的1/10号 凌晨 4 点 45 执行脚本
45 4 1,10 * *
# 每周六 、 日 的凌晨 1 点 10 分执行脚本
10 1 * * 6,7
# 每天的 18点到23 点 之间,每隔30分钟 执行一次
*/30 18-23 * * *
# # # 每隔一小时执行一次
0 * * * *
# 4 月份的周一至周三的上午 11 点 执行脚本
0 11 * 4 1-3
# # # 每天早上 7 点 到 上午 11 点 ,每 2 小时 运行 cmd 命令
0 7-11/2 * * *
注 : 本道题与往常的题有所区别 : 每2个小时 / 前面没有 *
# 每天 6 点 执行脚本
0 6 * * *
# 每天 10 点 31 开始,每隔 2 小时 重复一次
31 10/2 * * *
注 : 本道练习题 与 上一道 注释 的含义一样。
# # # 每 周一到周五 8 :00 ,每周一到周五 9 :00
0 8,9 * * 1-5
# 每天 10 :00 ,16 :00 执行
00 10,16 * * *