- 学习视频来自于B站【小白入门 通俗易懂】2021韩顺平 一周学会Linux。
- 可能会用到的资料有如下所示,下载链接见文末:
- 《鸟哥的Linux私房菜 基础学习篇 第四版》1
- 《鸟哥的Linux私房菜 服务器架设篇 第三版》2
- 《韩顺平_2021图解Linux全面升级》3
crond
crond
基本语法 首先来介绍一下任务调度的基本概念,所谓“任务调度”指的就是Linux系统在某个时间执行的特定的命令或程序。有些命令/程序需要重复执行,如病毒扫描、备份数据库等,这些命令/程序由一个名叫crond的后台程序管理(如上图所示);有些命令/程序只需要执行一次即可,如更新软件等,这些命令/程序则由一个名叫atd的后台程序管理。本节介绍如何使用crontab
进行重复定时任务的设置,下一节再介绍如何使用at
进行一次性定时任务的设置。下面是crontab
的基本语法:
# 基本语法-crontab
crontab [选项] # 命令行终端的格式
五个占位符表示的时间 命令 # 进入重复定时文件中的格式
# 常用选项-crontab
-e 编辑当前用户的crontab定时任务。
-l 查询当前用户所有的crontab任务。
-r 删除当前用户所有的crontab任务。
H 列出当前有那些任务调度。
service crond restart 重启crond任务调度程序。
上面常用的添加重复定时任务的指令是crontab -e
,此时会进入重复定时任务的管理文件中,每一行都表示一个重复定时任务,该文件的操作方式和vim编辑器相同。添加重复定时任务方法如上所说为“五个占位符表示的时间 指令/脚本
”,下面来详细详细介绍这5个占位符如何表示时间:
5个占位符的说明: 依次表示“分、时、日、月、天”,如下表11-1。
特殊符号说明:
- 星号
*
:代表任何时间。比如第一个“*"就代表每分钟都执行一次的意思。- 逗号
,
:代表不连续的时间。比如“0 8,12,16 * * * 命令
”代表在每天的8点0分、12点0分、16点0分都执行一次命令。- 杠
-
:代表连续的时间范围。比如“0 5 * * 1-6 命令
”代表在周一到周六的凌晨5点0分执行命令。*/n
:代表每隔多久执行一次。比如“*/10 * * * * 命令
”代表每隔10分钟就执行一次命令。时间设置案例:
45 22 * * * 命令
:每天的22点45分执行命令。0 17 * * 1 命令
:每周一的17点0分执行命令。0 5 1,15 * * 命令
:每月1号和15号的凌晨5点0分执行命令。40 4 * * 1-5 命令
:每周一到周五的凌晨4点40分执行命令。*/10 4 * * * 命令
:每天的凌晨4点,每隔10分钟执行一次命令。0 0 1,15 * 1 命令
【不推荐】:每月1号和15号,每周1的0点0分都会执行命令。注意“星期几”和“几号”最好不要同时出现,因为他们定义的都是天,非常容易让管理员混乱。
项目 | 含义 | 范围 |
---|---|---|
第一个“*” | 一小时当中的第几分钟 | 0-59 |
第二个“*” | 一天当中的第几小时 | 0-23 |
第三个“*” | 一个月当中的第几日 | 1-31 |
第四个“*” | 一年当中的第几月 | 1-12 |
第五个“*” | 一周当中的星期几 | 0-7(0和7都代表星期日) |
最后使用一个案例来验证上面所学。如希望每分钟都将/etc
的文件列表覆写到/tmp/to.txt
文件中,也就是重复执行指令ll /etc/ > /tmp/to.txt
,那么我们需要保存到任务调度文件中的代码就是:
*/1 * * * * ll /etc/ > /tmp/to.txt
下面展示四个应用案例:
【案例1】每隔1分钟,将当前的日期信息(date
)追加到/tmp/mydate
文件中。
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# */1 * * * * date >> /tmp/mydate
####################################
no crontab for root - using an empty one
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
[root@CentOS76 ~]# ll /tmp | grep mydate
-rw-r--r--. 1 root root 43 7月 22 16:08 mydate
[root@CentOS76 ~]# cat /tmp/mydate
2023年 07月 22日 星期六 16:08:01 CST
【案例2】每隔1分钟,将日期(date
)和日历(cal
)都追加到/home/mycal
文件中。当然可以写两次crontab -e
指令,但这并不聪明,于是便可以将这两条指令放在一个文件中,每个一分钟执行一次该文件即可。
[root@CentOS76 ~]# vim /home/my.sh
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# date >> /tmp/mycal
# cal >> /tmp/mycal
####################################
[root@CentOS76 ~]# ll /home | grep my.sh
-rw-r--r--. 1 root root 37 7月 22 16:15 my.sh
[root@CentOS76 ~]# chmod u+x /home/my.sh
[root@CentOS76 ~]# ll /home | grep my.sh
-rwxr--r--. 1 root root 37 7月 22 16:15 my.sh
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# */1 * * * * /home/my.sh >> /tmp/mycal
####################################
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
# 注:这个空行是我在my.sh里面多打了一行。
[root@CentOS76 ~]# cat /tmp/mycal
2023年 07月 22日 星期六 16:18:01 CST
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
# 上面的日期没有背景反转高亮
【案例3】每天凌晨2:00将mysql数据库testdb
备份到文件中。
提示:备份指令为
mysqldump -u root -p密码 数据库 >> /home/db.bak
[root@CentOS76 ~]# crontab -e
####################################
# 按照vim编辑器的格式,输入以下命令并保存:
# 0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
####################################
crontab: installing new crontab
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
【案例4】将当前用户的调度任务删除。
[root@CentOS76 ~]# crontab -l
*/1 * * * * date >> /tmp/mydate
*/1 * * * * /home/my.sh >> /tmp/mycal
0 2 * * * mysqldump -u root -proot testdb >> /home/db.bak
[root@CentOS76 ~]# crontab -r
[root@CentOS76 ~]# crontab -l
no crontab for root
at
at
基本语法 上面介绍的crond程序管理的任务是反复执行的,那有时候我就想定时执行某计划一次呢?这就是接下来要介绍的atd程序。默认情况下,atd守护进程每60秒检查作业队列,有作业时会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。注意at
命令是一次性定时计划任务,执行完一个任务后不再执行此任务了。另外,在使用at
命令的时候,一定要保证atd进程的启动,否则就不能执行定时计划任务,如ps -ef | grep atd
可以查看当前后台程序中是否有atd程序。下面时at
的基本语法:
# 基本语法-at
at [选项] [时间] # 注意:输入 两次Ctrl+D 结束at命令的输入!
atq # 等价于at -l,列出当前用户的at任务列表。
atrm x # 等价于at -d,删除当前用户的第x个at任务。
# 命令选项【使用较少】-at
-m 当指定的任务被完成后,将给用户发送邮件,即使没有标准输出。
-I atq的别名,查询。
-d atrm的别名,删除。
-v 显示任务将被执行的时间。
-c 打印任务的内容到标准输出。
-V 显示版本信息。
-q<队列> 使用指定的队列。
-f<文件> 从指定文件读入任务而不是从标准输入读入。
-t<时间参数> 以时间参数的形式提交要运行的任务。
上述at
的基本语法中包括“选项”和“时间”。实际上,at
很少使用“选项”,所以“时间”的定义才是重点。下面是at
指定时间的6种方法【重点】:
- 当天时间:接受在当天的
hh:mm
(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如04:00
。- 模糊词语:使用
midnight
(深夜)、noon
(中午)、teatime
(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。- 12小时计时制:即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。例如
12pm
。- 具体日期【中国常用】:指定格式为
month day
(月日)或mm/dd/yy
(月/日/年)或dd.mm.yy
(日.月.年),指定日期必须跟在指定时间的后面。例如04:00 2021-03-1
。- 相对计时法:指定格式为
now + count time-units
。now就是当前时间;time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期);count是时间的数量,几天、几小时。例如now + 5 minutes
。- 直接使用
today
(今天)、tomorrow
(明天)来指定完成命令的时间。
下面展示五个应用案例,注意at>
所在行输入完成后,输入 两次ctrl+D 才能退出at
。
【案例1】2天后的下午5点执行指令/bin/ls /home
。
[root@CentOS76 ~]# at 5pm + 2 days
at> /bin/ls /home<EOT>
job 7 at Mon Jul 24 17:00:00 2023
【案例2】使用atq
命令来查看系统中没有执行的一次性工作任务。
[root@CentOS76 ~]# atq
7 Mon Jul 24 17:00:00 2023 a root
【案例3】明天17点钟,输出时间(date
)到文件/root/date100.log
。
[root@CentOS76 ~]# at 5pm tomorrow
at> date > /root/date100.log<EOT>
job 8 at Sun Jul 23 17:00:00 2023
【案例4】2分钟后,输出时间(date
)到文件/root/date200.log
。
[root@CentOS76 ~]# at now + 2 minutes
at> date > /root/date200.log<EOT>
job 9 at Sat Jul 22 15:47:00 2023
[root@CentOS76 ~]# atq
9 Sat Jul 22 15:47:00 2023 a root
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
[root@CentOS76 ~]# ll
总用量 44
-rw-------. 1 root root 1883 7月 13 17:12 anaconda-ks.cfg
-rw-r--r--. 1 root root 43 7月 22 15:47 date200.log
-rw-r--r--. 1 root root 1931 7月 13 17:13 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4096 7月 13 19:44 公共
drwxr-xr-x. 2 root root 4096 7月 13 19:44 模板
drwxr-xr-x. 2 root root 4096 7月 13 19:44 视频
drwxr-xr-x. 2 root root 4096 7月 13 19:44 图片
drwxr-xr-x. 2 root root 4096 7月 13 19:44 文档
drwxr-xr-x. 2 root root 4096 7月 13 19:44 下载
drwxr-xr-x. 2 root root 4096 7月 13 19:44 音乐
drwxr-xr-x. 2 root root 4096 7月 13 19:44 桌面
[root@CentOS76 ~]# cat /root/date200.log
2023年 07月 22日 星期六 15:47:00 CST
[root@CentOS76 ~]# atq # 查看job执行完毕后,队列中是否还存在
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
【案例5】删除已经设置的所有一次性定时任务。
[root@CentOS76 ~]# atq
7 Mon Jul 24 17:00:00 2023 a root
8 Sun Jul 23 17:00:00 2023 a root
[root@CentOS76 ~]# atrm 7
[root@CentOS76 ~]# at -r 8
[root@CentOS76 ~]# atq
[root@CentOS76 ~]#
【案例6】1分钟后执行指令文件/home/my.sh
。
[root@CentOS76 ~]# at now + 1 minutes
at> /home/my.sh<EOT>
####################################
# my.sh内容为:
# date >> /tmp/mycal
# cal >> /tmp/mycal
# 并且,此时已经删除/tmp/mycal文件。
####################################
job 13 at Sat Jul 22 16:47:00 2023
[root@CentOS76 ~]# atq
13 Sat Jul 22 16:47:00 2023 a root
[root@CentOS76 ~]# ll /tmp | grep mycal
-rw-r--r--. 1 root root 205 7月 22 16:47 mycal
[root@CentOS76 ~]# cat /tmp/mycal
2023年 07月 22日 星期六 16:47:00 CST
七月 2023
日 一 二 三 四 五 六
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
结论:
- 只要创建过at任务,不管是atrm删除、重启等,都会保留job标号。
at>
那一行,若写错字符需要按 ctrl+backspace 才能删除。
《鸟哥的Linux私房菜 基础学习篇 第四版》 ↩︎
《鸟哥的Linux私房菜 服务器架设篇 第三版》 ↩︎
《韩顺平_2021图解Linux全面升级》 ↩︎