一. 前言
在求职过程中,有过面试经历的小伙伴们都知道,企业对linux的考察还是蛮频繁的。作为java开发程序员,在企业中我们的服务器都是在linux环境中部署的,所以熟练使用linux已经成为企业招聘人才的基本需求。但很多小伙伴在学习中很少使用linux,导致在面试中被问到linux时屡屡翻车,所以文哥专门收集了自己班级的学员,在面试时与linux相关的题目。今天文哥就以任务调度为例,来给大家谈谈linux中的定时任务调度。
二. 什么是定时任务调度
什么是任务调度?文哥是这么理解的,就是在linux操作系统中,需要定时或定期执行的任务。这些任务可能需要周而复始的执行,也可能是到点执行,只执行1次。那么这些任务有哪些呢?我做了两个分类:
第一:系统任务,有些重要的工作必须周而复始的执行,比如病毒扫描。
第二:个别用户的工作,个别用户希望执行某些程序,比如对mysql数据库的备份。
搞清楚了任务调度的基本概念之后,linux是如何实现任务调度的呢?这里主要有两个命令需要大家掌握,一个是crontab命令,还有一个是at指令。
三. crontab指令实现任务调度
1.crontab作用
首先我们来看下面这张图,来理解crontab指令的作用:
2.基本用法
crontab基本语法:crontab [选项]
常用选项:
-e:编辑定时任务
-l:查询定时任务
-r:删除当前用户的所有定时任务
3.案例需求
假如我们想创建一个定时任务,可以将etc目录下面的文件列表查询出来,追加到/tmp/etc.txt文件中,并每分钟执行1次。
[root@xq100 tmp]# crontab -e
输入任务调度内容:
*/1 * * * * ls -l /etc/ > /tmp/etc.txt
然后按esc键,保存并退出。
我们在/tmp下面查看,是否存在etc.txt。我们发现存在的。
如果我们把这个文件删除,一分钟之后,这个文件又会被创建出来。
[root@xq100 tmp]# rm -f etc.txt
[root@xq100 tmp]# date
Mon Aug 29 21:46:52 CST 2022
[root@xq100 tmp]# date
Mon Aug 29 21:47:01 CST 2022 #过去了1分钟
[root@xq100 tmp]# ll
total 1188
-rw-r--r--. 1 root root 16802 Aug 29 21:47 etc.txt # 删除的文件又出现了 因为1分钟之后,任务调度又出现了
4. crontab任务调度规则
占位符说明:
项目 | 含义 | 范围 |
第一个 “*” | 一个小时当中的第几分钟 | 0-59 |
第二个 “*” | 一天当中的第几个小时 | 0-23 |
第三个 “*” | 一个月当中的第几天 | 1月31日 |
第四个 “*” | 一年当中的第几个月 | 1月12日 |
第五个 “*” | 一周当中的星期几 | 0-7(0和7都代表星期日) |
特殊符号说明:
特殊符号 | 含义 |
* | 代表任何时间,比如第一个“*”就代表1小时中每分钟都执行1次的意思。 |
, | 代表不连续的时间,比如“0,8,12,16 * * *”就代表1天中的8点过0分,12点过0分,16点过0分都会执行1次。 |
- | 代表连续的时间范围,比如“0,5 * * 1-6”就代表星期1到星期6的凌晨5点过0分都会执行。 |
*/n | 代表每隔多久执行1次。比如“*/10 * * * *” 就代表每隔10分钟就执行1次命令。 |
特殊时间执行案例:
时间 | 含义 |
45 22 * * * | 每天在22时45分执行任务 |
0 17 * * 1 | 每周一的17点过0分执行任务 |
0 5 1,15 * * | 每月的1号和15号的凌晨5点钟执行任务 |
40 4 * * 1-5 | 每周1-到周5的凌晨4:40分执行任务 |
*/10 4 * * * | 每天的凌晨4点。每隔10分钟就执行1次任务 |
5. crondtab任务调度实例
下面我们通过几个案例,来进一步理解crond任务调度命令。
案例1:每隔1分钟,将当前的日期信息追加到/tmp/mydate.txt文件中。
[root@xq100 tmp]# */1 * * * * date >> /tmp/mydate.txt
案例2:每隔1分钟,将将当前的日期和日历都追加到/home/mycal.txt文件中。
分析:由于现在有获取当前的日期和日期两个指令,所以我们可以将这两条命令定义在脚本里面。然后再通过定时任务调度去执行脚本即可。
[root@xq100 home]# cd /home
[root@xq100 home]# vim my.sh
在my.sh里面编辑:
date >> /home/mycal.txt
cal >> /home/mycal.txt
按ESC,保存并退出。但是我们发现这个脚本,root没有执行权限。
我们需要修改脚本的权限,使当前用户root能够对脚本进行执行。
[root@xq100 home]# chmod u+x my.sh
接下来我们需要动态执行脚本。
[root@xq100 tmp]# crontab -e
保存并退出即可。我们来查看效果:
案例3:每天凌晨2点,将mysql数据库testdb,备份到文件中。(提示:备份数据库的指令为 mysqldump -u root -p密码 数据库名称 > /home/文件名称)
第一步:crontab -e
第二步:0 2 * * * mysqldump -u root -proot testdb > /home/db.bak
还有其他几个任务调度指令,大家了解一下:
crontab -r :终止任务调度;
contab -l :列出当前有哪些任务调度;
service crond restart [重启任务调度]。
四. at指令实现任务调度
1.at命令作用
文哥先给大家讲解一下at指令的含义和作用:
at命令是一次性定时执行任务计划,at的守护线程atd以后台的模式运行,检查作业队列来运行。
默认情况下,atd守护线程每60秒检查作业队列,有作业时会检查作业运行时间,如果时间与当前时间匹配,则运行此作业。
at命令是一次性定制的计划任务,执行完一个任务后就不再执行此任务了。
在使用at命令的时候,一定要保证atd进程的启动,可以用相关指令来查看(ps -ef | grep atd)。
下面我们用一幅图来说明at任务调度机制:
at时间定义:
格式 | 含义 | 举例 |
HH:MM | 当天 HH:MM 执行,若当天时间已过,则在明天 HH:MM 执行 | 当天 4:00 (若超时则为明天 4:00): 4:00 |
英文粗略时间单次 | midnight(午夜,00:00)、noon(中午,12:00)、teatime(下午茶时间,16:00) tomorrow(明天) | midnight、noon、teatime |
英文月名A 日期B [年份C] | C年A月B日执行 | 在 2018 年 1 月 15 日执行: January 15 2018 |
日期时间戳形式 | 绝对计时法 时间+日期 时间:HH:MM 日期:MMDDYY或MM/DD/YY或MM.DD.YY | 在 2018 年 1 月 15 日执行:011518或01/15/18或01.15.18 |
now + 数量 单位 | 相对计时法 以 minutes、hours、days 或 weeks 为单位 | 5 天后的此时此刻执行:now + 5 days |
2.at任务调度案例
常用选项
语法格式:
at [选项] [时间]
at > 命令(输入两次 Ctrl + D)
释义:
第一行:at 指令输入结束后,回车到下一行输入指令
第二行:开头的 at> 无需输入,是系统自动添加的
命令输入结束后:Ctrl + D 结束命令的输入,要输入两次
两天后的下午6点执行ll命令
使用atq命令,查看系统中有没有执行工作任务
[root@xq100 home]# atq
1 Wed Aug 31 17:00:00 2022 a root
2 Wed Aug 31 18:00:00 2022 a root
明天17点钟,输出时间都指定文件内,比如/home/date100.log
[root@xq100 home]# at 5pm tomorrow
at> date > /home/date100.log<EOT>
job 4 at Tue Aug 30 17:00:00 2022
2分钟后,输出时间到指定文件内,比如/home/dat200.log
[root@xq100 home]# at now + 2 minutes
at> date > /home/date200.log<EOT>
job 5 at Mon Aug 29 23:24:00 2022
使用atq查看队列任务:
2分钟之后,我们再次查看队列任务:
我们发现5号任务没有了,因为5号任务被执行了。所以被移出队列了。这就是为什么使用at指令执行定时任务,任务只执行1次的原因!
删除已经设置好的任务
[root@xq100 home]# atq
1 Wed Aug 31 17:00:00 2022 a root
2 Wed Aug 31 18:00:00 2022 a root
4 Tue Aug 30 17:00:00 2022 a root
[root@xq100 home]# atrm 1 # 删除1号任务
[root@xq100 home]# atq
2 Wed Aug 31 18:00:00 2022 a root
4 Tue Aug 30 17:00:00 2022 a root
五. 总结
文哥今天给大家分享了linux实现定时任务调度的几个常用指令。这两个指令在工作中是非常实用的,希望通过今天的分享,小伙伴们都能够熟练使用这两个命令。如果你在面试时被问到linux任务调度的实现,大家就可以按照文哥这篇帖子里的讲解去回答。