所谓的计划任务自认为就是服务器每天都有访问压力大的时候和压力小的时候,而根据我们的日常维护所得出一般服务器夜里压力比较小,而我们比如在执行大的操作的时候必须要避开服务器业务高峰和服务器压力过大的时候,所以我们会选择在夜里做操作,而这些操作只是执行一条命令而已,我们为了我们亲身等到后半夜来执行命令,那么我们就用到了计划任务的功能,计划任务也就是一次性或者周期性执行的任务;那么这样linux就为我们准备了两种计划任务,一种是只会执行一次at计划任务和一种可以周期性执行的cron计划任务。
二、计划任务的好处像一些做运维工作的,平时会有很多重复工作,如定点备份,定期重启服务,上线服务,定期检测等等,而这些任务有的需要在半夜进行,我们如果再等到半夜去操作会很累,很繁琐,所以我们这个时候就要用到计划任务了,只要我们把计划任务写好,我们就可以喝喝茶,干点其他事情了,也就不需要熬夜加班了。
三、计划任务的类型1.系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存
2.个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置。
常用语执行计划任务的命令——at,batch,与周期性任务相关的命令crontabs.
1.at命令和batch命令的区别
at命令旨在特定的之间执行任务;batch命令设置的任务由系统选择空闲时间去执行,空闲时间默认为cpu利用率小于0.8的时候
2.at命令
at的任务是否能运行依赖于atd服务
我们可以先查看下atd服务是否运行
centos6:service atd status
centos7:systemctl status atd
语法
at(选项)(参数)
选项
-f:指定包含具体指令的任务文件;
-q:指定新任务的队列名称;
-l:显示待执行任务的列表;
-d:删除指定的待执行任务;
-m:任务执行完成后向用户发送E-mail。
实例
at命令后想要执行程序的确切时间,然后回车
接着在>后输入你想要执行的命令,最后用Ctrl+d组合键退出at,像图中它就会在16:54执行ls,然后把结果发给root,我们可以在/var/spool/mail/root中查看
我们在时间后跟上tomorrow让它在明天某个时间执行,或者跟上确切日期 17:04 04/04/2018 这就是让它在2018年4月3日17:04执行
或者at now +10 minutes 十分钟后执行
当然不止minutes这个关键词可以使用,下面的关键词都可以使用
minutes:表示《分钟》。
hours:表示《小时》。 days:表示《天》。 weeks:表示《星期》。 months:表示《月》。 years:表示《年》。
atq和atrm命令:列出和删除正在等待执行的at任务
我们每次使用at命令指定延时执行的命令,at都会给其分配一个job编号,比如上面的例子中我们at任务编号就是4,下面我就给大家演示下具体如何操作
把任务删除后就不会再去执行了。
我们使用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相似,这里就不再介绍了。
2.crontab命令
之前我们介绍了at命令,在这里我就要跟大家介绍一个更强大的命令了,就是crontab,我们使用at命令只能执行某个命令一次,而crontab却可以重复执行命令,例如:每分钟,每小时,每天,每周等。
crontab其实是一个命令,用来读取和修改名为crontab的文件。这个crontab文件包含了你要定时执行的程序列表,也包含了执行的时刻。
实际上,有两个命令,一个叫crontab,一个叫cron。crontab用于修改crontab文件,cron用于实际执行定时的程序。
有三个常用参数:
-e:修改crontab文件。-l:显示crontab文件。-r:删除crontab文件
/etc/crontab 系统级计划任务的主配置文件
仅能通过 root定义,不过可以以普通用户的身份去执行计划任务中的命令。
内容如下:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/# For details see man 4 crontabs# Example of job definition:# .---------------- minute (0 - 59)# | .------------- hour (0 - 23)# | | .---------- day of month (1 - 31)# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat# | | | | |# * * * * * user-name command to be executed
前四行是用来配置crond任务运行的环境变量,第一行SHELL变量指定了系统要使用哪个shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
下面的注释则是配置文件格式,以及每一个※所对应的含义。
在这里我就跟大家详细介绍下每一段的定义:
第一段应该定义的是:分钟,表示每个小时的第几分钟来执行。范围是从0-59
第二段应该定义的是:小时,表示从第几个小时来执行,范围是从0-23
第三段应该定义的是:日期,表示从每个月的第几天执行,范围从1-31
第四段应该定义的是:月,表示每年的第几个月来执行,范围从1-12
第五段应该定义的是:周,表示每周的第几天执行,范围从0-6,其中 0表示星期日。
每六段应该定义的是:用户名,也就是执行程序要通过哪个用户来执行,这个一般可以省略;
第七段应该定义的是:执行的命令和参数。
我们在文件的最后一行添加内容如:5 * * * * ls
就是指定每小时的第5分钟执行一次ls命令
我们也可以在指令前添加用户:0 */2 * * * user1 ls
指定每两个小时以user1身份执行一次ls
我们也可以写一些每天要执行的脚本文件放在一个目录下:30 5 * * * root run-parts /etc/cron.daily
指定每天的 5:30 执行/etc/cron.daily目录下的所有可执行文件(如果要单独执行某个脚本需要把run-parts,后面跟上脚本名就可以了)
我们需要记住几个特殊符号的含义:
"*"代表取值范围内的数字,
"/"代表"每",
"-"代表从某个数字到某个数字,
","分开几个离散的数字
那么在每周一至周五的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 #不中断服务,重新载入配置
我们还有一种增加调度任务的方法就是:
crontab -e 然后写入相应的计划任务,写完后保存退出就可以了,这种方法写的调度任务是在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。
PS:cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务。
crontab -r 删除全部计划,不跟参数是删除当前用户的计划,跟用户名则是删除某个用户的计划。