让系统,在什么时候,要去做什么事情!
在Linux系统中,通过atd、crond这两个系统服务实现一次性、周期性计划任务的功能,并分别通过at、crontab命令进行计划任务的设定。
8学习目标:
l 熟悉掌握RHEL7例行性工作排程
l 熟练在RHEL7中执行一次的工作排程
l 熟练在RHEL7中循环执行的例行性工作排程
l 本章重点回顾
at:可以处理仅运行一次就结束排程的命令!且需要开启atd服务。
cron :持续例行性的做下去!即循环计划任务。
1、进行登录档的轮替 (log rotate):
Linux 会主动的将系统所发生的各种资讯都记录下来,这就是登录档。大型文件不但占容量还会造成读写效能的困扰,因此适时的将登录档数据挪一挪,让旧的数据与新的数据分别存放,则比较可以有效的记录登录资讯。
2、登录档分析logwatch的任务:
如果系统发生了软件问题、硬件错误、资安问题等,绝大部分的错误资讯都会被记录到登录档中,因此系统管理员的重要任务之一就是分析登录档。
3、创建 locate 的数据库:
该命令是透过已经存在的档名数据库来进行系统上档名的查询。
4、whatis数据库的创建:
使用whatis命令时,必须要拥有whatis数据库,而这个数据库也是透过系统的例行性工作排程来自动运行的。
5、RPM 软件登录档的创建:
RPM是一种软件管理的机制。由于系统可能会常常变更软件,包括软件的新安装、非经常性升级等,都会造成软件档名的差异。为了方便未来追踪,系统也帮我们将档名作个排序的记录。有时候系统也会透过排程来帮忙 RPM 数据库的重新建置。
6、移除缓存档:
系统透过例行性工作排程运行名为tmpwatch的命令来删除这些缓存档。
7、与网络服务有关的分析行为
Linux 系统通常就会主动的分析该软件的登录档,关于凭证与认证的网络资讯是否过期的问题。
一次性的计划任务是指当你通过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 这个命令。
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.
2、at创建计划任务存放路径
创建计划任务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
说明:每创建一个计划任务就会在该目录下创建一个文件,一旦该计划任务被执行,时间一过,文件就会被删除。
3、at的使用方式及参数:
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
循环的计划任务crontab来实现,循环的计划任务是指,当你利用crontab创建一个计划任务,并且该任务被调度执行完之后不会被删除,等待下一次满足该计划任务被调度的时间条件,一旦时间条件被满足,将会再一次被执行。所以称为循环的计划任务!
crontab包含cron守护进程的一系列作业和指令。
1、每个用户可以拥有自己的crontab文件;
2、同时,操作系统保存一个针对整个系统的crontab文件,该文件通常存放于/etc/crontab,而这个文件只能由系统管理员来修改。
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 |
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的目录,将要每隔五分钟运行的『可运行档』都写到该目录下,就可以让系统每五分钟运行一次该目录下的所有可运行档。
有的时候,我们以系统的cron来进行例行性工作的创建时,要注意一些使用方面的特性。举例来说,如果我们有四个工作都是五分钟要进行一次的,那么是否这四个动作全部都在同一个时间点进行?如果同时进行,该四个动作又很耗系统资源,如此一来,每五分钟不是会让系统忙得要死?
² 资源分配不均的问题
当大量使用 crontab 的时候,总是会有问题发生的,最严重的问题就是『系统资源分配不均』的问题,侦测主机流量的资讯,包括:
Ø 流量
Ø 区域内其他 PC 的流量侦测
Ø CPU 使用率
Ø RAM 使用率
Ø 线上人数即时侦测
如果每个流程都在同一个时间启动的话,那么在某个时段时,我的系统会变的相当的繁忙,所以,这个时候就必须要分别配置啦!我可以这样做:
一、系统可以通过at这个指令来排程单一工作的任务!
1、[at TIME]为指令下达的方法,当at进入排程后,系统执行该排程工作时,会到下达时的目录进行任务;
2、at 的执行必须要有atd服务的支援,且 /etc/at.deny为控制是否能够执行的使用者帐号;
3、通过atq, atrm可以查询与删除 at 的工作排程;
二、系统的循环例行性工作排程使用crond这个服务,同时利用 crontab -e及 /etc/crontab 进行排程的安排;
1、crontab -e 设定项目分为六栏,『分、时、日、月、周、指令』为其设定依据;
2、/etc/crontab 设定分为七栏,『分、时、日、月、周、执行者、指令』为其设定依据;