一:概述
系Linux系统常常会自动执行一些日常任务。在Linux系统中,有许多的管理任务需要频繁的定时执行,比如日志文件的轮转、备份数据等。自己写的脚本程序也可以有效的帮助我们管理自己的系统,提高执行效率。有两种任务的调度方式crot和at。
二:cron调度方式
(1) cron这种任务调度方式使用crontab命令来循环执行设置任务,它依赖的服务是crond。使用这个服务器之前需要检查crond的状态是否处于运行的状态(active(running))。查看crond状态可以使用systemctl status crond命令,这个服务默认的情况下是处于运行状态的/演示结果如下图所示:
我这个里面的那个服务没有开启,所以一开始没有显示,如果你想开启这个服务就需要执行systemctl start cron命令注意没有那个d。如果你想停止这个任务,可以执行systemctl stop cron就可以了。它可以调度周期性的任务作业,它会按照不同的事件组合重复。
(2) 如果你想使用cron调度方式,在这之前需要了解一些与其相关的配置文件。普通用户使用crontab命令设置周期任务时,相关的设置会记录到/var/spool/cron目录下的文件中。这个目录下的文件可以使用普通用户权限创建每个用户都可以使用crintab命令来注册属于自己的crontab文件。每一行表示执行一个任务,每个字段表示一项设置。用户的crontab文件由6个字段组成,分别是分钟、小时、天、月、星期和命令。系统的crontab文件保存的地方和普通用户不同,/etc/crontab用来记录和系统相关的任务调度,这个文件只能由系统的管理员修改。系统的cronrab文件由七个字段组成,分别是分钟、小时、天、月、星期、用户名和命令,字段由空格进行分隔。
系统的crontab文件和用户的crontab文件差不多,只是系统的crontab文件第六位指定的是用户名。/etv/crontab文件的内容并不长,使用cat命令可以查看里面记录的内容,演示如下图所示:
这个文件里面的内容,解释如下:
- 第一行SHELL指定了系统要使用的Shell类型是bash。
- 第二行PATH指定了执行文件的查找路径。
- 第三行MAILTO指定crond的任务执行信息将通过电子邮件的形式发送给root用户。如果不指定用户,则表示不发送任务执行信息要给用户。
要记住普通用户和系统用户的crontab文件位置,这些文件和crond服务有关。
(3) 使用crontab命令设置周期性任务时,可以指定任意的时间组合crontab命令非常适合周期性的日志分析或者数据备份之类的工作。
命令格式:crontab [选项] [文件名]
crontab命令的选项,如下表所示,这几个选项里面最常用就是-e选项,经常会用到-e选项去编辑crontab的任务内容。
选项 |
说明 |
-e |
编辑cronrab任务的内容 |
-l |
显示crontab任务内容 |
-r |
删除素有的crontab任务内容 |
-u |
帮助其他用户创建或删除crontan任务内容(仅限root使用) |
在使用crontab命令编辑任务之前,还需要了解用户crontab文件里面的6个相关字段的含义:
字段 |
说明 |
分钟 |
0-59 |
小时 |
0-23 |
日 |
1-31 |
月 |
12 |
周 |
0-7(0或者7为星期日) |
命令 |
指定需要执行的命令 |
除了上面的6个字段外,有几个比较特殊的符号,如下表所示:
符号 |
说明 |
*(星号) |
表示所有可能的值。比如日和月是*,就表示不论何月何日都会执行后续的命令 |
,(逗号) |
表示分隔离散的数字 |
-(减号) |
表示一个范围 |
/(正斜线) |
指定时间的间隔频率 |
知道了这些之后,下面使用crontab -e命令进入编辑界面,默认的使用vi编辑器。
比如设置10分钟显示一次当前的工作目录,然后把结果记录到文件/tmp/mytask中。第一个字段表示间隔10分钟,执行命令时使用绝对路径比较好
*10 * * * * * /bin/pwd > > /temp/mytask
编辑好了之后,按下ESC键输入:wq保存并且退出。这样你就创建了一个循环任务。使用cronrab -l命令可以查看你编写的crontab任务的内容。
注意:如果是以普通用户创建这个任务,查看配置文件时需要使用root身份才可以。普通用户的cron记录可以才/var/spool/cron目录下查看。
使用tail -f命令可以实时的查看追加到文件中的信息,如果想结束查看可以使用Ctrl + c命令返回到命令提示符界面。
三:cron调度方式的限制
cron调度方式的两个限制文件是/etc/cron.allow文件和/etc/cron.deny文件。第一个文件里面记录的是都是允许使用crontab的用户,第二个文件里面记录的是不能使用crontab的用户了。
默认情况下,所有的用户都能使用crontab。/etc/cron.allow文件的优先级高于/etc/cron.deny文件,如果这两个文件同时存在,就只有/etc/cron.allow文件生效。
如果你只想删除一个crontab任务,需要指定-e选项。想要删除所有的crontab任务直接使用crontab -r命令即可。
当你删除普通用户的crontab任务之后,再用root权限查看,/var/spool/cron目录属于Ubuntu用户的crontab文件也会被删除。想禁止Ubuntu用户使用crontab,直接使用vi编辑器在文件/etc/cron.deny中添加ubuntu这个用户名就行了,一个用户一行。
一旦禁止。这个用户不能使用crontab命令设置任务了。要想对用户进行限制操作,建议你在/etc/cron.deny文件中添加禁止用户的名单,因为系统默认保留这个文件。
还有一个和crontab相关的服务anacron,事先声明这个anacron服务并不替代crontab。anacron每天定期执行命令,由系统管理员设置并进行系统维护。anacron可以每天、每周、每月这样周期性的检测系统未执行的crontab任务。当机器关机重启后anacron程序会检查任务是否在周期内执行完毕,如果有未执行的任务,anacron会去执行这个任务,执行完毕之后它会自己停下来。anacron服务的配置文件是/etc/anacrontab,编辑配置文件的时候需要root权限。可以认为crontab是定时地去执行任务,过了这个时间就不会再去执行了。而anacron是定期地去执行任务,这个定期指的是一段周期性的时间。它们是可以同时存在的。
三:at调度
at调度方式只能执行一次任务,它依赖的服务是atd。要查看这个服务的状态可以使用systemctl status atd命令,如果你的这个服务没有启动就使用命令systemctl enable atd开机,就会自动启动这个服务。at命令可以在指定的时间内仅执行一次命令。
命令格式:at [选项] 时间
at命令的选项如下表所示:
选项 |
说明 |
-f |
制定具体的任务文件 |
-l |
显示待执行任务列表,相当于atq |
-d |
删除指定的待执行任务 |
-m |
任务执行完成之后向用户发送邮件 |
at只能在指定时间内执行一次,时间规格如下:
时间规格 |
说明 |
HH:MM |
时:分,例如20:55,就表示晚上八点55分 |
midnight |
表示午夜 |
noon |
表示中午 |
now |
表示目前的时间 |
teatime |
表示下午4点的时间 |
am,.pm |
am表示上午。pm表示下午 |
日期的设置方式:
日期规格 |
说明 |
MMDDYY、MM/DD/YY、MM.DD.YY |
月日年。071422表示是2022年7月14日 |
today |
表示今天 |
tomorrow |
表示明天 |
还可以使用+这种方式指定关键字设置时间。如下表所示:
关键字 |
说明 |
now + 50 mintues |
表示当前时间的50分钟之后执行 |
noon + 1 hour |
表示在13:00执行命令 |
next week + 3 day2 |
表示10天后执行命令 |
下面举个例子说明:
使用at命令设置在8分钟后将a命令输出到文件/tmp/setat中,命令为:at now +8 minutes..
使用atrm指定任务之后可以删除指定的执行的任务,还有atq命令可以查看执行任务。删除之后,可以看到已经没有等待执行任务了。
注意:像cron对用户有限制,at也一样。编辑/etc/at.allow和/etc/at.deny文件可以设置一般用户的执行权限,在/etc/at.allow文件中可以添加允许执行at命令的用户,/etc/at.deny文件里就是被拒绝使用at用户了。
使用at命令执行时,先在/etc/at.allow文件中设置,没有这个文件的情况下再去设置/etc/at.deny文件。如果这两个文件都没有,那就只有root用户可以使用root了。这连个文件里的这只用户和cron一样,一个用户占一行。