1、计划任务是什么
计划任务,字面意思理解就是在约定好的时间执行已经计划好的工作。在Linux中我们经常使用cron服务来完成这项工作。比如我们可以使用cron来做一个每天晚上12点备份一个日志文件,这就是个计划任务。
2、计划任务的好处
例如做运维工作的,平时会有很多重复工作,如定点备份,定期重启服务,上线服务,定期检测等等,而这些任务有的需要在半夜进行,我们如果再等到半夜去操作会很累,很繁琐,所以我们这个时候就要用到计划任务了,只要我们把计划任务写好,我们就可以喝喝茶,干点其他事情了,也就不需要熬夜加班了。
3、计划任务的类型
1)系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2)个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置
4、计划任务的实现
常用于执行计划任务的命令:
at:一次性的,单次有效
batch
crontab:周期性的,长期有效
4.1 at任务与crontab任务的区别
计划任务的安排方式分为两种:
一种是定时性的:也就是例行。就是每隔一定的周期就要重复来做这个事情
一种是突发性的:就是这次做完了这个事情,下次就没有了。临时决定,只有一次执行
at 和 crontab 这两个命令:
at:可以处理仅执行一次就结束的命令
crontab:会把你指定的工作或任务,比如:脚本等,按照设定的周期循环执行
5、at 延时执行任务
1)at命令和batch命令的区别
at命令旨在特定的时间执行任务;batch命令设置的任务由系统选择空闲时间去执行,空闲时间默认为cpu利用率小于0.8的时候
2)at命令
at的任务是否能运行依赖于atd服务
我们可以先查看下atd服务是否运行
centos6:service atd status
centos7:systemctl status atd
3)安装 at
[root@shell ~]#
[root@shell ~]# yum list at
[root@shell ~]# yum install at #安装at
[root@shell ~]# systemctl start atd #开启atd服务
[root@shell ~]# systemctl enable atd #设置atd服务开机自启动
[root@shell ~]# systemctl status atd #查看服务运行状态
4)语法
at(选项)(参数)
选项如下:
-f:指定包含具体指令的任务文件
-q:指定新任务的队列名称
-l:显示待执行任务的列表
-d:删除指定的待执行任务
-m:任务执行完成后向用户发送E-mail
5) 实例
[root@shell ~]#
[root@shell ~]# cat /etc/passwd #查看系统用户
[root@shell ~]#
[root@shell ~]# at now
at> userdel boy #删除该用户
at> userdel xinhua #删除该用户
at> <EOT>
job 4 at Thu Jun 11 18:55:00 2020
[root@shell ~]#
[root@shell ~]# cat /etc/passwd #查看计划任务是否执行成功
at 命令后面 为想要执行程序的确切时间,然后回车
接着在 >后面输入你想要执行的命令,最后用Ctrl+d组合键退出at,像图中它就会在此刻执行删除用户的命令
我们在时间后跟上tomorrow让它在明天某个时间执行,或者跟上确切日期 17:02 06/12/2020
或者at now +10 minutes 十分钟后执行
当然不止minutes这个关键词可以使用,下面的关键词都可以使用
minutes:表示《分钟》
hours:表示《小时》
days:表示《天》
weeks:表示《星期》
months:表示《月》
years:表示《年》
atq 和 atrm命令:列出和删除正在等待执行的at任务
我们每次使用at命令指定延时执行的命令,at都会给其分配一个job编号,比如上面的例子中我们at任务编号就是4,下面我就给大家演示下具体如何操作
[root@shell ~]#
[root@shell ~]# at now +5 minutes #5分钟以后执行
at> touch test.txt
at> <EOT>
job 5 at Fri Jun 12 14:09:00 2020
[root@shell ~]#
[root@shell ~]# atq #查看at任务
2 Fri Jun 12 18:30:00 2020 a root #系统默认运行
5 Fri Jun 12 14:09:00 2020 a root #我刚刚创建的
[root@shell ~]#
[root@shell ~]# atrm 5 #删除at任务5
[root@shell ~]#
[root@shell ~]# atq #查看at任务5是否被删除
2 Fri Jun 12 18:30:00 2020 a root
[root@shell ~]#
[root@shell ~]# at -l #此命令同时也是查看at任务5是否被删除
2 Fri Jun 12 18:30:00 2020 a root
[root@shell ~]#
把任务删除后就不会再去执行了
我们使用 at -l 同样可以查看要延时执行的任务
at 还有黑名单和白名单功能
(黑名单):仅当 /etc/at.deny 存在时(默认)写入deny的用户不能配置at
(白名单):当/etc/at.allow存在时/etc/at.deny失效,只有写在allow中的用户才能配置at
当/etc/at.allow及/etc/at.deny都不存在时,仅有root才能配置at
bath 命令的用法和at相似,这里就不再介绍了
6、crontab 计划任务
之前我们介绍了 at 命令,在这里我就要跟大家介绍一个更强大的命令了,就是crontab,我们使用at命令只能执行某个命令一次,而crontab却可以重复执行命令,例如:每分钟,每小时,每天,每周等。
crontab其实是一个命令,用来读取和修改名为crontab的文件。这个crontab文件包含了你要定时执行的程序列表,也包含了执行的时刻。
实际上,有两个命令,一个叫 crontab,一个叫 cron。crontab用于修改crontab文件,cron用于实际执行定时的程序。
# systemctl is-enabled crond.service #查看crond服务是否是开机自启动,crond服务必须是开机自启动
/etc/cron*目录下文件说明:
cron.deny #控制用户是否能做计划任务的文件;
cron.monthly #每月执行的脚本;
cron.weekly #每周执行的脚本;
cron.daily #每天执行的脚本;
cron.hourly #每小时执行的脚本;
crontab #主配置文件
crontab 有三个常用参数:
-e:修改crontab文件
-l:显示crontab文件
-r:删除crontab文件
/etc/crontab 为系统级计划任务的主配置文件
仅能通过 root定义,不过可以以普通用户的身份去执行计划任务中的命令。
主配置文件内容如下:
[root@shell ~]#
[root@shell ~]# cat /etc/crontab
前3行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash;
第二行PATH变量指定了系统执行命令的路径;
第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户;
下面的注释则是配置文件格式,以及每一个※所对应的含义
在这里我就跟大家详细介绍下每一段的定义:
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。
时间记忆口诀:分 时 日 月 周
1)几个特殊符号
* *号,表示任意时间都,也是”每”的意思,举例:如00 23 * * *cmd表示每月每周每日的23:00都执行cmd任务 ;
- 减号,表示分隔符,表示一个时间段范围段,如17-19点,每小时的00分执行任务,00 17-19 * * * cmd 。就是17,18,19点整点分别执行的意思 ;
, 逗号,表示分隔时段的意思,30 17,18,19 * * * /bin.sh /scripts/dingjian.sh表示每天17,18和19点的半点时刻执行/scripts/dingjian.sh脚本。也可以和”-”结合使用,如:30 3-5,17-19 * * * /scripts/dingjian.sh ;
/n N代表数字,即”每隔n单位时间”,如:每10分钟执行一次任务可以写成*/10 * * * * cmd,其中“*/10”的范围是0-59,因此也可以写成0-59/10
那么在每周一至周五的10:30开始,每隔2小时重复一次就是
30 10-23/2 * * 1-5
PS:我们每次修改完crontab都需要重启服务才能生效。我们制定的脚本也都要给加上执行权限,不然是无法执行的。
重启命令如下:
/etc/rc.d/init.d/crond restart #重启
/etc/rc.d/init.d/crond reload #不中断服务,重新载入配置
2)我们还有一种增加调度任务的方法就是
crontab -e 然后写入相应的计划任务,写完后保存退出就可以了,这种方法写的调度任务是在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
PS:cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
crontab -r 删除全部计划任务,不跟参数是删除当前用户的计划,跟用户名则是删除某个用户的计划。
3)实例
[root@shell ~]#
[root@shell ~]# systemctl status crond #先查看cron服务是否在运行
[root@shell ~]# crontab -l #查看当前环境是否存在计划任务
no crontab for root #当前不存在任何计划任务
[root@shell ~]#
实例1:每天凌晨2点01分开始备份数据
[root@shell ~]# crontab -e #编辑计划任务
no crontab for root - using an empty one
1 2 * * * tar cfP /root/123.tar /opt/123/ #每天凌晨2点01分开始备份数据
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]# crontab -l
1 2 * * * tar cfP /root/123.tar /opt/123/
[root@shell ~]#
实例2:为 ctsi 用户,创建一个计划任务
[root@shell ~]#
[root@shell ~]# crontab -u ctsi -e
no crontab for ctsi - using an empty one
1 2 * * * tar cfP /root/123.tar /opt/123/ #每天凌晨2点01分开始备份数据
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]# crontab -u ctsi -l
1 2 * * * tar cfP /root/123.tar /opt/123/
[root@shell ~]#
实例3:查看所有的计划任务
[root@shell ~]# cat /var/spool/cron/ctsi
1 2 * * * tar cfP /root/123.tar /opt/123/
[root@shell ~]#
[root@shell ~]# cat /var/spool/cron/root
1 2 * * * tar cfP /root/123.tar /opt/123/
[root@shell ~]#
实例4:每月的1,10,22号5:21分在/tmp/创建一个a.txt
[root@shell ~]#
[root@shell ~]# crontab -e
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# crontab -l
21 5 1,10,22 * * touch /tmp/a.txt
[root@shell ~]#
实例5:每月的1到10号的5:21,输入hello word
[root@shell ~]# crontab -e
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]# crontab -l
21 5 1-10 * * echo "hello world"
[root@shell ~]#
实例6:每隔2天的8-11点的3分和15分,创建一个/tmp/b.txt
[root@shell ~]# crontab -e
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]#
[root@shell ~]# crontab -l
3,15 8-11 */2 * * touch /tmp/b.txt
[root@shell ~]#
实例7:周一到周五的21:15,创建/tmp/d.txt
[root@shell ~]# crontab -e
crontab: installing new crontab
[root@shell ~]#
[root@shell ~]# crontab -l
15 21 * * 1-5 touch /tmp/d.txt
[root@shell ~]#
实例8:删除cron计划任务
[root@shell ~]#
[root@shell ~]# crontab -l #查看计划任务
15 21 * * 1-5 touch /tmp/d.txt
[root@shell ~]#
[root@shell ~]# crontab -r #删除计划任务
[root@shell ~]#
[root@shell ~]# crontab -l
no crontab for root
[root@shell ~]#
实例9:每周六、日上午9:00和下午14:00执行ls /root
[root@zabbix ~]# crontab -e #编辑写入计划任务内容
[root@zabbix ~]# crontab -l #查看当前存在的计划任务
00 9,14 * * 6,0 /usr/bin/ls /root
[root@zabbix ~]#
[root@zabbix ~]# tail -1 /var/spool/cron/root #查看root用户的计划任务内容
00 9,14 * * 6,0 /usr/bin/ls /root
[root@zabbix ~]#