linux任务计划
有时候我们要执行某个任务,但是又不希望立刻执行,而是希望未来某个时间点或者时间段去执行,这就是所谓的任务计划。

任务计划分为一次性任务计划和周期性任务计划

 

一次性任务计划:在未来的某个时间点执行一次某任务

执行一次任务计划可以使用at、batch命令来完。  接下来介绍如何使用at命令和batch命令来完成一次性任务计划。

at的运行需要依靠atd这个服务才可以进行,因此,必须先启动atd这个服务才行。

# service atd start

 

at命令的语法格式

at   TIME:后面只需接时间即可,指定的时间又可以分为如下几种:

                     指定时间的方式:

                     使用绝对时间方式:HH:MM,DD.MM.YY  MM/DD/YY   这接的都是具体时间

                     使用相对时间方式:now+# 。这里的时间单位可以是minutes、hours、days、weeks。

                     使用模糊时间:noon、midnight(晚上12点)、teatime(下午四点)

 

执行at   时间命令后,就会出现at<提示符,在该提示符下,输入我们要执行的命令,如果命令输入完成,使用Ctrl+d来提交我们要执行的命令。

    wKiom1Pl92HjpvhVAABEIng3OWo476.jpg

其中job  2表示第2个任务,后面的时间表示要执行任务的时间

当某个任务执行完成后,系统会以邮件的形式将任务的执行结果发送给安排任务的用户。因此,在屏幕上是不会显示任务执行的结果的。

 

如何查看要执行的任务

使用at -l或者atq命令可以来查看要执行的任务

wKiom1Pl-OeSRMXLAAA-ISXtk_U725.jpg

第一段表示任务id(这里就这叫做job_id)

第二段表示执行任务的时间

第三段表示任务队列

第四段表示这个任务属于哪一个用户

 

如何删除任务

使用at -d  job_id 或者atrm  job_id

wKiom1Pl-evR6805AAB-3Hx4qaE822.jpg

 

查看某个任务的实际指令内容

使用at -c  job_id

 

at的使用限制

为了系统安全,我们需要限制只允许我们认可的用户使用at命令,而那些不认可的用户禁止使用atd命令。在我们的系统上,有2个文件用来限制at的使用。

/etc/at.allow:写在这个文件里的用户可以使用at,没写的则不能使用at命令。

/etc/at.deny:如果/etc/at.allow这个文件不存在,则写在这个文件里的用户不能使用at命令,没写的则可以使用这个命令。

如果这两个文件都不存在,则只允许root用户使用。每行一个用户。

 

batch命令

完成一次性任务计划也可以使用batch命令,batch与at唯一的区别是不需要指定时间,batch执行的任务

是在系统比较空闲的情况下完成的。例如:

wKioL1Pl_LfA8jfXAABCsv4ARp0701.jpg

 

周期性任务计划

使用一次性任务只能在未来某个时间点执行一次,如果某个任务需要反复的执行,那么我们就需要借助周期性任务来完成。

周期性任务计划依靠crond这个服务来完成的。既然是周期性任务,所以crond(或cron)这个服务就需要不间断的运行,一旦Linux系统关闭,那么可能在某个时间点要执行的任务就不会被执行。

那么该如何解决由于其他原因导致过去该执行的任务没有被执行呢?

使用anacron就可以实现让crond因为各种原因在过去时间本该执行而没有被执行的任务,在恢复正常时执行一次。这样就可以解决那些没有被执行的任务了。anacron是crond的补充,但替代不了crond。

因此,我们的重点仍然是介绍crond的使用

 

 

crond任务

crond任务分为系统crond任务和用户crond任务 

 

系统cron任务

系统cron任务的配置文件为/etc/crontab,这个文件的内容是:

wKioL1PmBC2jxKYDAADJEbJokRA777.jpg

第一行是使用的shell

第二行是定义的环境变量路径

        由于系统任务很可能是在没有用户登入的情况下执行的,一旦没有用户登入的话,那么我们的PATH变量就不会存在,所以我们在使用ls、cat等执行某个任务时,会发现执行错误,原因是因为这些命令会在PATH这个环境变量中去查找相应的二进制程序,一旦PATH变量不存在,那么使用ls、cat等命令自然执行不了,所以在执行任务时,建议使用绝对路径来执行,不然会出现错误哦。

第三行是将执行的结果发给谁

第四行是shell的家目录

后面的部分则是执行的任务,其中:

        第一段 :表示分钟,取值为0-59

        第二段:表示小时,取值为0-23

        第三段:表示天数,取值为1-31

        第四段:表示月份,取值为1-12

        第五段:表示星期,取值为0-7,0和7都表示星期天

        第六段:表示执行者身份

        第七段:表示执行的任务

        其中run-parts是一个二进制程序,这个程序后面需要接一个参数,且这个参数必须是目录。也就是说run-parts命令后面的/etc/cron.hourly等这些文件都是目录。run-parts会逐个执行这些目录下的每一个可执行文件。放置在这些目录下的可执行文件都是系统默认要执行的周期性任务。

 

时间表示方式

*:表示对应时间内所有的有效取值。例如:

       3 * * * * :表示每小时的第三分钟

       3 * * * 0:表示每个星期天的每小时第3分钟

       13 12 6 7 *:表示每年7月6号12点13分

          

离散时间点:使用逗号将多个时间点隔开。例如

       10,40  * * * 2,5 :表示每个星期2和每个星期五的每小时的第10分钟和第40分钟

 

连续时间点:使用"-"符号,来表示一段时间范围。例如:

        10 * * * 1-5 :表示星期1,2,3,4,5的每小时的第10分钟

 

对应取值范围内多久一次,使用*/N的方式来表示。例如:

        */3 * * * *  :表示每3分钟 

        0 0 */3 * *  :表示每三天的0点0分执行


说明:在设置周期性任务计划时,需要将时间精确到分(有时候还需要精确到小时)。如每隔三天执行一次任务,就不能使用如下这种方式:

* * */3 * *

虽然*/3表示每三天,但是也没有准确的说是3天后的哪个时间执行,因此,需要将时间精确到分钟和小时。使用如下这种方式就可以:

0 0 */3 * *


 

 

/etc/crontab支持2种指令下达方式

1、直接指令下达

如:每小时执行一次mail命令,以root的身份发一封邮件给boy。

0 * * * * root /bin/mail -s 'hello' boy < /root/a.txt

 

2、通过目录的方式下达

由于系统有了run-parts这个命令,那么可以借助run-parts命令来逐个执行目录下的可执行文件,

如:创建一个目录/test,将需要执行的可执行文件放置在/test目录下,系统每5分钟会执行/test这个目录下的所有可执行文件。

/5 * * * * root run-parts /test

 

 

 

用户cron任务

用户cron任务的配置文件是/var/spool/cron/USERNAME

在用户配置文件中是有6段,没有执行者身份这一段,其余部分文件与/etc/crontab文件相同。

 

crontab:管理用户周期性任务

默认情况下,用户cron任务的配置文件是/var/spool/cron/USERNAME,所以我们只需要编辑该文件,增加我们的周期性任务即可。但是为了便于在添加任务时,检查语法错误,我们一般使用crontab命令来管理周期性任务。

crontab命令使用:

-l :列出当前用户的所有cron任务。

-e:编辑某个用户cron配置文件。

-r:移除所有cron任务。

-u  USERNAME {-l|-e|-r}:管理某个指定用户的cron任务。只有root用户才可以使用该命令。如果没有指定该参数,则表示当前用户。

 

默认情况下,cron任务执行完成后会将执行结果发送给管理员。

 

crontab的使用限制

为了安全起见,和at命令一样,可以限制使用crontab的用户。

限制使用crontab用户有2个文件,分别是:

/etc/cron.allow:写在这个文件中的用户可以使用crontab命令,没写的则不能使用。

/etc/cron.deny:写在这个文件中的用户不可以使用crontab命令,没写的则可以。默认/etc/cron.allow比/etc/cron.deny要优先。

 

anacron命令

anacron可以将cron过去没有执行的任务执行一次,他的配置文件是/etc/anacrontab

wKiom1PmEjHSMBe4AADVl9XkvJg774.jpg

其中以1       65      cron.daily              run-parts /etc/cron.daily这一行来说明

1表示该任务未被执行经过的天数

65表示系统开机后65分钟执行该任务

cron.daily表示注释信息

run-parts /etc/cron.daily表示执行的任务

 

要想使用cron和anacron来实现周期性任务计划,需要确保这两个进程同时在运行。默认情况下anacron进程没有运行。

wKiom1PmE3mixjf8AABy69HA2TA264.jpg