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来提交我们要执行的命令。
其中job 2表示第2个任务,后面的时间表示要执行任务的时间
当某个任务执行完成后,系统会以邮件的形式将任务的执行结果发送给安排任务的用户。因此,在屏幕上是不会显示任务执行的结果的。
如何查看要执行的任务
使用at -l或者atq命令可以来查看要执行的任务
第一段表示任务id(这里就这叫做job_id)
第二段表示执行任务的时间
第三段表示任务队列
第四段表示这个任务属于哪一个用户
如何删除任务
使用at -d job_id 或者atrm job_id
查看某个任务的实际指令内容
使用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执行的任务
是在系统比较空闲的情况下完成的。例如:
周期性任务计划
使用一次性任务只能在未来某个时间点执行一次,如果某个任务需要反复的执行,那么我们就需要借助周期性任务来完成。
周期性任务计划依靠crond这个服务来完成的。既然是周期性任务,所以crond(或cron)这个服务就需要不间断的运行,一旦Linux系统关闭,那么可能在某个时间点要执行的任务就不会被执行。
那么该如何解决由于其他原因导致过去该执行的任务没有被执行呢?
使用anacron就可以实现让crond因为各种原因在过去时间本该执行而没有被执行的任务,在恢复正常时执行一次。这样就可以解决那些没有被执行的任务了。anacron是crond的补充,但替代不了crond。
因此,我们的重点仍然是介绍crond的使用
crond任务
crond任务分为系统crond任务和用户crond任务
系统cron任务
系统cron任务的配置文件为/etc/crontab,这个文件的内容是:
第一行是使用的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
其中以1 65 cron.daily run-parts /etc/cron.daily这一行来说明
1表示该任务未被执行经过的天数
65表示系统开机后65分钟执行该任务
cron.daily表示注释信息
run-parts /etc/cron.daily表示执行的任务
要想使用cron和anacron来实现周期性任务计划,需要确保这两个进程同时在运行。默认情况下anacron进程没有运行。