第十六节.计划任务

最后更新于 2021-11-18 466 次阅读


在Linux中我们可以根据任务执行的方式和次数将计划任务分成在某个时间执行一次的固定任务(at),和依照一定的间隔进行多次重复任务的循环任务(crontab)

1.单一任务at

(1)atd的开启与运行方式

①.开启atd服务

在Linux中,单一任务使用的是atd这个服务,默认情况下系统不一定开启这个服务,我们可能需要手动进行开启

查看是否开启:systemctl status atd

开机启动命令:systemctl enable atd

开启命令:systemctl start atd

②.atd的运行方式

我们使用【at】这个命令来写入某个任务,然后这个任务会被写入/var/spool/at目录中并等待着atd服务的使用与执行

但是并不是所有用户都可以使用【at】这个命令,我们可以自由决定能够执行【at】命令的用户,通过修改【/etc/at.allow】和【/etc/at.deny】这两个文件的内容

首先【/etc/at.allow】这个文件规定了能够使用【at】命令的用户,若是这个文件存在,但是里面没有名单的话,则所有用户都不能使用【at】命令

然后【/etc/at.deny】这个文件规定了不能够使用【at】命令的用户,若是文件存在,但是没有名单的话,则所有用户都能够使用【at】命令

若是两个文件都不存在,则只有root用户能使用at命令

③.at的使用

命令格式:at 【-m l d v】 TIME

重点在于“TIME”,并且at输出的任务信息是以mail的形式发到mailbox的

使用at后会进入at shell,要求我们输入要执行的任务,这里要求使用命令的绝对路径来进行输入,输入完成后使用【ctrl+d】来结束任务输入

常用参数:

-m:无论at执行的命令是否有数据输出,只要任务完成后就往mailbox发送信息

-l:相当于atq,列出当前系统上所有使用者的at计划

-d:相当于atrm,可以删除一个在at计划中的任务

-v:使用较明显的时间格式来列出at计划中的任务列表

TIME:时间格式,这里可以定义出【什么时候要执行at这项任务】

HH:MM ex>08:00

早上8点执行任务,若是已经过了,则顺延到明天

HH:MM YYYY:MM:DD ex>08:00 2021:08:31

规定某年某月某日某时某分执行任务

HH:MM(now)[am/pm] + number [minutes|hours|days|weeks]

ex>13:00 + 5 minutes ex > now +10 minutes

2.循环任务(crontab)

和at任务在某个固定时间执行一次不同的是,crontab能够实现多次的循环计划任务

当然,crond和atd一样,也可以设定不同用户的使用权限,同样是有/etc/cron.allow和/etc/cron.deny两个文件,allow规定了能够使用crond的用户,deny规定了不能够使用crond的用户

在我们执行了crontab之后,该计划命令会以用户为单位被记录在/var/spool/cron/中,例如laoju这个用户的计划命令,就会被记录在/var/spool/cron/laoju中。但是建议不要使用Vi命令来直接编辑该文件,以防语法错误出现cron无法执行的情况

(1)用户执行crontab的方式

命令格式:crontab 【-u username】【-l | -e | -r】

常用参数:

-u:只有root用户能使用这个参数,后面跟用户名,代表root替后边的用户创建或修改/删除crontab计划任务

例:crontab -u laoju -e(替laoju这个用户修改crontab任务内容)

-l:查看当前系统上的crontab任务内容

-e:编辑当前系统上的crontab任务内容

-r:删除当前系统上的所有crontab任务内容(记得是所有,如果只删除一个的话,就使用-e来编辑)

(2)crontab计划内容的格式

我们来查看一下crontab的格式内容是怎么样的

crontab 内容展示

以上图为例子,这几个字段的含义分别是:分(0~59),时(0~23),日期(1~31),月份(1~12),周(0~7,其中0和7都表示周日),命令

前5个字段表示时间,第6个字段是命令

时间字段还有四个特殊的字符:

*(星号):类似通配符,表示任何时刻

,(逗号):代表分隔时段,例如【30 3,6 * * * command】就代表3点30分与6点30分两个时间点执行任务,记得时间之间是【与】的关系

-(减号):代表一个时间范围,例如【20 3-6 * * * command】代表3点到6点之间,每隔20分钟就执行一次任务

/n(斜线):n代表数字,代表【每隔n单位时间间隔】,例如【30 6 /3 * * command】就代表每隔三天,就在上午6点30执行命令

案例演示:我想每年9月1号早上8点就给我的女友嘉然(jiaran)发送一封信,信的内容为/home/laoju/jiaran_lovelettle,如何操作?

首先我们肯定要先编辑/home/laoju/jiaran_lovelettle的内容,接着【crontab -e】开始编辑计划任务的内容

内容为:* 8 1 9 * mail -S “for lady jiaran” jiaran < /home/laoju/jiaran_lovelettle

接着:wq保存后,再使用【crontab -l】查看一下计划任务的内容,确认保存了就大功告成

(3)系统的例行性任务设置

上边所说的【crontab -e】主要针对的是用户的计划循环任务,如果我们是设置系统的例行性执行任务,我们只要直接vim编辑【/etc/crontab】的内容就好

【/etc/crontab】的文件内容如下

这里我们要注意计划任务的设计字段,其与【crontab -e】不同的是,其第六字段不是命令,而是【user-name】,也就是执行该循环任务的用户用户名,默认为root用户

(4)crontab配置文件地址

crontab服务主要读取三个地方的脚本配置文件,分别是【/etc/crontab】【/etc/cron.d/*】还有【/var/spool/cron/*】

其中,与系统服务相关的是【/etc/crontab】和【/etc/cron.d/*】这两个地方的文件,与用户相关的是【/var/spool/cron/*】

我们如果想开发自己的软件的cron服务,就可以按照crontab中文件的格式,以【分 时 日....】的日期写出一个文件,放置在【/etc/cron.d/*】文件中

/etc/cron.d目录内容
/etc/cron.d/vbirdlogfile 文件内容

而如果我们已经想好了要按时、或天或周、月来直接执行某个脚本的话也可以直接把脚本丢进【/etc/cron.hourly】【/etc/cron.daily】等。。目录中

比如【/etc/cron.hourly】,在该目录里的脚本文件,会在整点的前5分钟内,随机找一个时间来执行,也就免去了我们去设置crontab文件的麻烦

(5)crontab案例演示

我想制作一个能够自动更新我的原神BOT的脚本,然后让他能够固定在早上5点钟进行更新,我应该怎么设置?

首先我先编制一个脚本,脚本内容如下

这个脚本会将命令执行的结果以邮件的方式发送到root这个用户上

接着,我们使用【crontab -e】命令来创建我们的循环任务

任务格式为:* 5 * * * source /root/Adachi-BOT/adchi.update.sh

crontab内容

这里注意,我们一定要使用【source】来执行我们的脚本,因为我们的脚本只能在/root/Adachi-BOT这个目录下执行,所以我们需要在父进程里运行这个脚本(如果不加source,那么就是在子进程中进行,子进程的环境变量不会影响到父进程的环境变量,所以cd /root/Adachi-BOT这个命令是不会生效的)