第十一章计划任务

让系统,在什么时候,要去做什么事情!

Linux系统中,通过atd、crond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、crontab命令进行计划任务的设定。

8学习目标:

熟悉掌握RHEL7例行性工作排程

熟练在RHEL7中执行一次的工作排程

熟练在RHEL7中循环执行的例行性工作排程

本章重点回顾

11.1 Linux例行性工作排程

11.1.1Linux工作排程的种类

at:可以处理仅运行一次就结束排程的命令!且需要开启atd服务。

cron :持续例行性的做下去!即循环计划任务。

11.1.2常见的例行性工作的应用

1进行登录档的轮替 (log rotate)

Linux 会主动的将系统所发生的各种资讯都记录下来,这就是登录档大型文件不但占容量还会造成读写效能的困扰,因此适时的将登录档数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录资讯

2登录档分析logwatch的任务:

如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误资讯都会被记录到登录档中,因此系统管理员的重要任务之一就是分析登录档。

3创建 locate 的数据库:

该命令是透过已经存在的档名数据库来进行系统上档名的查询。

4whatis数据库的创建:

使用whatis命令时,必须要拥有whatis数据库,而这个数据库也是透过系统的例行性工作排程来自动运行的。

5RPM 软件登录档的创建:

RPM一种软件管理的机制。由系统可能会常常变更软件,包括软件的新安装、非经常性升级等,都会造成软件档名的差异。为了方便未来追踪,系统也帮我们将档名作个排序的记录有时候系统也会透过排程来帮忙 RPM 数据库的重新建置

6移除缓存档:

系统透过例行性工作排程运行名为tmpwatch的命令来删除这些缓存档

7与网络服务有关的分析行为

Linux 系统通常就会主动的分析该软件的登录档,关于凭证与认证的网络资讯是否过期的问题

11.2一次性计划任务

11.2.1一次性计划任务概念

一次性的计划任务是指当你通过at的方式配置一个计划任务,并且被调用执行之后,该计划任务的配置文件会被删除,所以只能执行一次。称为一次性计划任务。为了安全性考虑,可用/etc/at.allow/etc/at.deny这两个文件来针对用户做限制。

先找寻 /etc/at.allow 这个文件,写在这个文件中的使用者才能使用 at ,没有在这个文件中的使用者则不能使用 at (即使没有写在at.deny当中)

如果 /etc/at.allow不存在,就寻找 /etc/at.deny 这个文件,若写在这个at.deny的使用者则不能使用 at ,而没有在这个at.deny文件中的使用者,就可以使用 at 

如果两个文件都不存在,那么只有 root 可以使用 at 这个命令。

 

11.2.2单一工作排程运行方式

1、一次性计划任务前提是Linux 系统上面必须要有负责这个排程的服务atd

[root@server0 ~]# systemctl enable atd#每次开机都正常启动atd服务

ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/multi-user.target.wants/atd.service'

[root@server ~]# systemctl restart atd.service#重新启动atd服务

[root@server0 ~]# systemctl status atd#检查atd目前的状态

atd.service - Job spooling tools

   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled)

   Active: active (running) since Tue 2017-02-28 01:40:49 CST; 1h 22min ago

 Main PID: 561 (atd)

CGroup: /system.slice/atd.service

└─561 /usr/sbin/atd -f

Feb 28 01:40:49 localhost systemd[1]: Started Job spooling tools.

 

2at创建计划任务存放路径

创建计划任务at now + 10 min

终止任务编写 ctrl +d

[root@server ~]# ls -l /var/spool/at/

total 4

-rwx------. 1 root   root   2778 Feb 27 17:02 a00002017a7728

drwx------. 2 daemon daemon    6 Jan 29  2014 spool

说明:每创建一个计划任务就会在该目录下创建一个文件,一旦该计划任务被执行,时间一过,文件就会被删除。

 

3at的使用方式及参数:

at -c 工作编号

 

选项与参数:

-m  :当 at 的工作完成后,即使没有输出信息,亦以 email 通知使用者该工作已完成。

-l  :at -l 相当atq,列出目前系统上面的所有该使用者的 at 排程;

-d  :at -d 相当atrm ,可以取消一个在 at 排程中的工作;

-v  :可以使用较明显的时间格式列出 at 排程中的工作列表;

-c  :可以列出后面接的该项工作的实际命令内容。

 

TIME:时间格式,这里可以定义出『什么时候要进行 at 这项工作』的时间,格式有:

  HH:MM ex> 04:00

在今日的 HH:MM 时刻进行,若该时刻已超过,则明天的 HH:MM 进行此工作。

  HH:MM YYYY-MM-DD ex> 04:00 2017-03-17

强制规定在某年某月的某一天的特殊时刻进行该工作!

  HH:MM[am|pm] [Month] [Date] ex> 04pm March 17

也是一样,强制在某年某月某日的某时刻进行!

  HH:MM[am|pm] + number [minutes|hours|days|weeks]

ex> now + 5 minutes ex> 04pm + 3 days

就是说,在某个时间点『再加几个时间后』才进行。

 

  4、应用例子

1、查询目前主机上面有多少的 at工作排程

[root@server ~]# atq

4 Sun Mar 26 23:00:00 2017 a root

5 Mon Feb 27 17:27:00 2017 a root

You have new mail in /var/spool/mail/root

 

2、将上述的第 5 个工作移除!

[root@server ~]# atrm 5

 

3再过五分钟后,将 /root/.bashrc 寄给root自己

[root@server ~]# at now + 5 min

at> /bin/mail root -s "hello,world" < /root/.bashrc

at><EOT>

job 5 at Mon Feb 27 17:27:00 2017

 

4将上述的第 4 项工作内容列出来查阅

[root@server ~]# at -c 4

#!/bin/sh

# atrunuid=0 gid=0

# mail root 0

umask 22

……

 

5、由机房预计2017/03/27停电,打算在2017/03/26 23:00关机?

[root@server ~]# at 23:00 2017-3-26

at> /bin/sync

at> /sbin/shutdown -h 0 now

at><EOT>

job 4 at Sun Mar 26 23:00:00 2017

11.3循环性计划任务

11.3.1循环性计划任务概念

循环的计划任务crontab来实现,循环的计划任务是指,当你利用crontab创建一个计划任务,并且该任务被调度执行完之后不会被删除,等待下一次满足该计划任务被调度的时间条件,一旦时间条件被满足,将会再一次被执行。所以称为循环的计划任务!

crontab包含cron守护进程的一系列作业和指令。

1每个用户可以拥有自己的crontab文件;

2同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc/crontab,而这个文件只能由系统管理员来修改。

 

11.3.2使用者的配置:

 

1启动/重cron服务

[root@server0 ~]# systemctl enable crond

[root@server0 ~]# systemctl restart crond.service

 

2默认情况下,任何使用者只要不被列入 /etc/cron.deny当中,那么他就可以直接下达『 crontab -e 』去编辑自己的例行性命令了!整个过程就如同上面提到的,会进入 vi 的编辑画面,然后以一个工作一行来编辑,编辑完毕之后输入『 :wq』储存后离开 vi 就可以了!而每项工作 (每行) 的格式都是具有六个栏位,这六个栏位的意义为:

crontab 的语法

  Crontab -e-------------分钟小时,日期,月,星期,action

(日、月、星期不要同时设置!别搞混了!)

 

 

代表意义

分钟

小时

日期

月份

命令

数字范围

0-59

0-23

1-31

1-12

0-7

action

 

选项与参数:

-e  :编辑 crontab 的计划任务

[root@server0 ~]# crontab -e

crontab: installing new crontab

 

-l  :浏览当前用户的crontab,即浏览已存在的计划任务列表

[root@server0 ~]# crontab -l

*/10   *  *  *  *   /bin/echo hello >> /tmp/f6

00,30  *  *   *   *  run_daily_cmd

 

-r  :移除所有的 crontab 的工作内容,若仅要移除一项,请用 -e 去编辑

[root@server0 ~]# crontab -r

[root@server0 ~]# crontab -l

no crontab for root

 

-u  :指定计划任务属于个用户

[root@server0 ~]# crontab -e -u cxt

 [root@server0 ~]# crontab -l -u cxt

*  15,18  *     *   *  run_daily_cmd

注意:只有root用户才能通过-u选项为普通用户创建计划任务,普通用户可以通过crontab-e为自己创建计划任务。

 

3所有的计划任务存放的路径:

[root@server0 ~]#  ls -l /var/spool/cron/

total 8

-rw-------. 1 root root 37 Feb 28 02:46 cxt

-rw-------. 1 root root 38 Feb 28 04:00 root

 

4、为了安全性的问题,将可以使用 crontab 的普通用户写入/etc/cron.allow中,若不在这个文件内的使用者则不可使用 crontab;如果crontab 的普通用户写入 /etc/cron.deny中,使用者则不可使用 crontab

[root@server0 ~]# vim /etc/cron.deny

cxt

[root@server0 ~]# su - cxt

[cxt@server0 ~]$ crontab -e

You (cxt) are not allowed to use this program (crontab)

See crontab(1) for more information

[cxt@server0 ~]$ exit

logout

[root@server0 ~]# useraddJohn

[root@server0 ~]# su - John

[a@server0 ~]$ crontab -e   #如果在/etc/cron.deny没有写入用户John,/etc/cron.allow要写入该普通用户,不然也不可crontab -e

You (a) are not allowed to use this program (crontab)

See crontab(1) for more information

 

5、应用实例

1每隔10分钟执行任务计划

*/10   *  *  *  *   /bin/echo hello >> /tmp/f6

 

2每隔半个小时执行任务计划

00,30  *  *   *   *  run_daily_cmd

 

3每天的 15点和18点执行任务计划

*  15,18  *     *   *  run_daily_cmd

 

4每天的15点到18点,每隔一个小时执行一次计划任务

*  15-18  *   *   *  run_daily_cmd

 

*(星号)

代表任何时刻都接受的意思!举例来说,范例一内那个日、月、周都是 * ,就代表著『不论何月、何日的礼拜几的 12:00 都运行后续命令』的意思!

,(逗号)

代表分隔时段的意思。举例来说,如果要下达的工作是 3:00 6:00 时,就会是:

0 3,6 * * * command

-(减号)

代表一段时间范围内,举例来说, 8 点到 12 点之间的每小时的 20 分都进行一项工作:

20 8-12 * * * command

/n(斜线)

那个 n 代表数字,亦即是『每隔 n 单位间隔』的意思,例如每五分钟进行一次,则:

*/5 * * * * command

 

11.3.3系统的配置文件

1、在 Linux 中的 crontab 会自动的帮我们每分钟重新读取一次 /etc/crontab 的例行工作事项,但是某些原因或者是其他的 Unix 系统中,由于 crontab 是读到内存当中的,所以在你修改完 /etc/crontab 之后,可能并不会马上运行,这个时候需要重新启动crond这个服务!

[root@www ~]# cat /etc/crontab

SHELL=/bin/bash                     <==使用哪种 shell 介面

PATH=/sbin:/bin:/usr/sbin:/usr/bin  <==运行档搜寻路径

MAILTO=root                         <==若有额外STDOUT,以 email将数据送给谁

HOME=/                              <==默认此 shell 的家目录所在

 

# run-parts

01  *  *  *  *   root      run-parts /etc/cron.hourly<==每小时

02  4  *  *  *   root      run-parts /etc/cron.daily<==每天

22  4  *  *  0   root      run-parts /etc/cron.weekly<==每周日

42  4  1  *  *   root      run-parts /etc/cron.monthly<==每个月 1

运行者身份  命令串

 

Ø MAILTO=root

/etc/crontab 这个文件中的例行性工作的命令发生错误时,或者是该工作的运行结果有 STDOUT/STDERR 时,会将错误信息或者是萤幕显示的信息传给谁?默认当然是由系统直接寄发一封 mail root 

Ø PATH=....

01 * * * * root run-parts /etc/cron.hourly

这个 /etc/crontab 里面预配置义出四项工作任务,分别是每小时、每天、每周及每个月分别进行一次的工作!系统默认的例行性工作是以 root 的身份来进行的。

 

2/etc/crontab 这个文件里面支持两种下达命令的方式,

一种是直接下达命令,一种则是以目录来规划,例如:

命令型态:1 * * * * dmtsai mail -s "testing" kiki< /home/dmtsai/test.txt

dmtsai这个使用者的身份,在每小时运行一次 mail 命令。

 

目录规划:*/5 * * * * root run-parts /root/runcron

创建一个 /root/runcron的目录,将要每隔五分钟运行的『可运行档』都写到该目录下,就可以让系统每五分钟运行一次该目录下的所有可运行档。

11.3.4一些注意事项

有的时候,我们以系统的cron来进行例行性工作的创建时,要注意一些使用方面的特性。举例来说,如果我们有四个工作都是五分钟要进行一次的,那么是否这四个动作全部都在同一个时间点进行?如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟不是会让系统忙得要死?

² 资源分配不均的问题

当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题,侦测主机流量的资讯,包括:

Ø 流量

Ø 区域内其他 PC 的流量侦测

Ø CPU 使用率

Ø RAM 使用率

Ø 线上人数即时侦测

如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙,所以,这个时候就必须要分别配置啦!我可以这样做:

 

 

11.4本章重点回顾

一、系统可以通过at这个指令来排程单一工作的任务!

1[at TIME]为指令下达的方法,当at进入排程后,系统执行该排程工作时,会到下达时的目录进行任务;

2at 的执行必须要有atd服务的支援,且 /etc/at.deny为控制是否能够执行的使用者帐号;

3、通过atq, atrm可以查询与删除 at 的工作排程;

 

二、系统的循环例行性工作排程使用crond这个服务,同时利用 crontab -e/etc/crontab 进行排程的安排;

1crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;

2/etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;