11 Linux实操篇-实时任务调度

11 Linux实操篇-实时任务调度

  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》1
  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》2
  3. 《韩顺平_2021图解Linux全面升级》3

11.1 重复任务调度crond

11.1.1 crond基本语法

Linux
定时调用
定时调用
定时调用
系统工作
如:病毒扫描
crond后台程序
个别用户工作
如:完成对mysql备份
...
图11-1 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。

特殊符号说明:

  1. 星号*:代表任何时间。比如第一个“*"就代表每分钟都执行一次的意思。
  2. 逗号,:代表不连续的时间。比如“0 8,12,16 * * * 命令”代表在每天的8点0分、12点0分、16点0分都执行一次命令。
  3. -:代表连续的时间范围。比如“0 5 * * 1-6 命令”代表在周一到周六的凌晨5点0分执行命令。
  4. */n:代表每隔多久执行一次。比如“*/10 * * * * 命令”代表每隔10分钟就执行一次命令。

时间设置案例:

  1. 45 22 * * * 命令:每天的22点45分执行命令。
  2. 0 17 * * 1 命令:每周一的17点0分执行命令。
  3. 0 5 1,15 * * 命令:每月1号和15号的凌晨5点0分执行命令。
  4. 40 4 * * 1-5 命令:每周一到周五的凌晨4点40分执行命令。
  5. */10 4 * * * 命令:每天的凌晨4点,每隔10分钟执行一次命令。
  6. 0 0 1,15 * 1 命令【不推荐】:每月1号和15号,每周1的0点0分都会执行命令。注意“星期几”和“几号”最好不要同时出现,因为他们定义的都是天,非常容易让管理员混乱。
表11-1 5个占位符的说明
项目 含义 范围
第一个“*” 一小时当中的第几 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

11.1.2 应用实例

下面展示四个应用案例:
【案例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 722 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 722 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 722 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备份到文件中。

扫描二维码关注公众号,回复: 16328553 查看本文章

提示:备份指令为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

11.2 一次性定时任务-at

11.2.1 at基本语法

Linux
每60秒检查一次
job队列-各任务仅执行一次
job1
job2
...
atd程序
执行一次后,即退出队列
图11-2 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种方法【重点】:

  1. 当天时间:接受在当天的hh:mm(小时:分钟)式的时间指定。假如该时间已过去,那么就放在第二天执行。例如04:00
  2. 模糊词语:使用midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
  3. 12小时计时制:即在时间后面加上AM(上午)或PM(下午)来说明是上午还是下午。例如12pm
  4. 具体日期【中国常用】:指定格式为month day(月日)或mm/dd/yy(月/日/年)或dd.mm.yy(日.月.年),指定日期必须跟在指定时间的后面。例如04:00 2021-03-1
  5. 相对计时法:指定格式为now + count time-units。now就是当前时间;time-units是时间单位,这里能够是minutes(分钟)、hours(小时)、days(天)、weeks(星期);count是时间的数量,几天、几小时。例如now + 5 minutes
  6. 直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。

11.2.2 应用实例

下面展示五个应用案例,注意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 713 17:12 anaconda-ks.cfg
-rw-r--r--. 1 root root   43 722 15:47 date200.log
-rw-r--r--. 1 root root 1931 713 17:13 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 4096 713 19:44 公共
drwxr-xr-x. 2 root root 4096 713 19:44 模板
drwxr-xr-x. 2 root root 4096 713 19:44 视频
drwxr-xr-x. 2 root root 4096 713 19:44 图片
drwxr-xr-x. 2 root root 4096 713 19:44 文档
drwxr-xr-x. 2 root root 4096 713 19:44 下载
drwxr-xr-x. 2 root root 4096 713 19:44 音乐
drwxr-xr-x. 2 root root 4096 713 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 722 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

结论:

  1. 只要创建过at任务,不管是atrm删除、重启等,都会保留job标号。
  2. at>那一行,若写错字符需要按 ctrl+backspace 才能删除。

  1. 《鸟哥的Linux私房菜 基础学习篇 第四版》 ↩︎

  2. 《鸟哥的Linux私房菜 服务器架设篇 第三版》 ↩︎

  3. 《韩顺平_2021图解Linux全面升级》 ↩︎

猜你喜欢

转载自blog.csdn.net/weixin_46258766/article/details/131977565