Linux任务调度

来自CloudWiki
跳转至: 导航搜索

linux允许用户根据需要,在指定的时间自动运行指定的进程,也允许用户将非常消耗资源和时间的进程,如数据备份,扫描病毒等,安排到系统比较空闲的时间,由系统自动执行,这种让系统在特定的时间执行指定任务的方法,称为任务调度。

用户可采用以下方法实现任务调度:

  • 对于只只运行一次的进程,采用at调度
  • 对于特定时间重复运行的进程采用cron调度。

计划任务管理 —— at

简介

在指定的日期、时间点自动执行预先设置的一些命令操作,属于一次性计划任务

服务脚本名称:/etc/init.d/atd

设置格式:at [HH:MM] [yyyy-mm-dd]

[root@localhost ~]# systemctl start atd
启动 atd:                                               [确定]
[root@localhost ~]# date
Mon Jul  2 08:14:33 CST 2018
[root@localhost ~]# at 08:16  
at> who
at> wall Happy   #按Ctrl+ D 提交任务
at> ^F<EOT>
job 2 at 2018-07-02 08:16
...
[root@localhost ~]# date
Mon Jul  2 08:16:00 CST 2018
[root@localhost ~]#
Broadcast message from root@localhost.localdomain (Mon Jul  2 08:16:01 2018):Happy



表达方式

时间参数:

  • 绝对时间表达法:at 17:30 05012015
  • 相对时间表达法:
at 14:00

at now + 1 hour 

at 17:00 tomorrow 

at 4:30pm + 2 days
[root@ecs-c6f9 ~]# at now + 3 hours
warning: commands will be executed using /bin/sh
at> <EOT>
job 7 at Tue May 17 11:53:00 2022
[root@ecs-c6f9 ~]# at 09:00am +3days
warning: commands will be executed using /bin/sh
at> <EOT>
job 8 at Fri May 20 09:00:00 2022
[root@ecs-c6f9 ~]# at 09:00 05172022

案例1:三天后的下午5点执行/bin/ls /

命令:

[root@vms002 /]# at 5pm+3 days
at> /bin/ls /<EOT>
job 1 at Fri Jun 14 17:00:00 2019

案例2:明天17点钟,输出时间到指定文件内

命令:

[root@vms002 /]# at 17:00 tomorrow
at> date > /root/date.log
at> reboot
at> <EOT>
job 2 at Wed Jun 12 17:00:00 2019

案例3:计划任务设定后,在没有执行之前我们可以用atq命令来查看系统中没有执行的工作任务

命令:

[root@vms002 /]# atq
1	Fri Jun 14 17:00:00 2019 a root
2	Wed Jun 12 17:00:00 2019 a root

案例4:删除已经设置的任务

命令:

[root@vms002 /]# atq
1	Fri Jun 14 17:00:00 2019 a root
2	Wed Jun 12 17:00:00 2019 a root
[root@vms002 /]# atrm 1
[root@vms002 /]# atq
2	Wed Jun 12 17:00:00 2019 a root

案例5:显示已经设置的任务内容

命令:

[root@vms002 /]# at -c 2
#!/bin/sh
# atrun uid=0 gid=0
# mail root 0
umask 22
******此处省略部分内容*****
date > /root/date.log

思考题:

绝对时间               关机

今天几点                备份

两个小时后              重启

明天几点                清空目录

从几点开始两天后       打印字符 

计划任务管理 —— crontab

艾特调度中指定的命令只能执行一次,但在实际的系统管理中,有些命令需要在指定的日期和时间重复执行,即具有周期性执行的特点,例如每天例行的数据备份工作,cron调度就能满足这种需要。

什么是crontab

按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务

服务脚本名称:/etc/init.d/crond

主要设置文件:

全局配置文件,位于文件:/etc/crontab 
用户定义的设置,位于文件:/var/spool/cron/用户名

crond守护进程

crond守护进程每隔一分钟就检测一次,是所有注册用户的crontab配置文件,并按照其设置内容,定期重复执行指定的cron调度工作。在红帽系统中,crond守护进程有crond服务管理,因此该守护进程可以用service命令启动,停止或查看。

[root@localhost ~]#  systemctl status crond
crond (pid  1762) is running...
[root@localhost ~]# chkconfig --list crond
crond           0:off   1:off   2:on    3:on    4:on    5:on    6:off

默认情况下,crond服务在系统启动时自动启动,并一直运行于后台。

crontab配置文件

crontab配置文件用于存放任务调度的时间和要启动的进程等信息。crond进程,维护着一个缓冲池(spool)目录,来保持crontab文件,通常这个目录是/var/spool/cron。另外在/etc还有一个全局配置文件/etc/crontab配置文件


管理cron计划任务

编辑计划任务:crontab -e [-u 用户名]

查看计划任务:crontab -l [-u 用户名]

删除计划任务:crontab -r [-u 用户名]

root用户可以管理指定用户的计划任务

普通用户只能管理自己的计划任务

crontab -e

*/5 * * * * echo "hello world"





crontab任务的配置格式

按照预先设置的时间周期(分钟、小时、天……)重复执行用户指定的命令操作,属于周期性计划任务

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

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  *  command to be executed


Linux5-2.png

时间数值的特殊表示方法

*	   表示该范围内的任意时间
,    表示间隔的多个不连续时间点
-	   表示一个连续的时间范围
/	   指定间隔的时间频率


应用示例

0  17  *  *  1-5		周一到周五每天17:00 
30  8  *  *  1,3,5	每周一、三、五的8点30分
0  8-18/2  *  *  *	8点到18点之间每隔2小时
0  *  */3  *  *		每隔3天

应用示例2:

*/5 * * * * echo "hello world"
0 17 * * * echo "hello world"
0 17 * * 1-5 echo "hello world"
0 17 * * 1,3,5 echo "hello world"
0 8-18/2 * * 1,3,5 echo "hello world"

crontab应用示例

示例1(root用户):

  • 每天早上7:50自动开启sshd服务,22点50时关闭
  • 每隔5天清空一次FTP服务器公共目录/var/ftp/pub
  • 每周六的7:30时,重新启动httpd服务
  • 每周一、三、五的17:30时,打包备份/etc/httpd目录

50 7 * * * service sshd start

50 22 * * * service sshd stop

  • * */5 * * rm -rf /var/ftp/pub/*

30 7 * * 6 service httpd restart

30 17 * * 1,3,5 tar -zxvf /etc/httpd -C /usr/local

示例2(jerry用户):

每周日晚上23:55时将“/etc/passwd”文件的内容复制到宿主目录中,保存为pwd.txt文件


示例3:

root用户查看自己的计划任务列表

查看并删除jerry用户设置的计划任务

[root@localhost root]# crontab -l -u jerry
55 23 * * 7  /bin/cp /etc/passwd /home/jerry/pwd.txt
[root@localhost root]# crontab -r -u jerry
[root@localhost root]# crontab -l -u jerry
no crontab for jerry
[root@localhost root]#

实验:管理进程并设置计划任务

需求描述

  • 管理系统中的进程
    • 确认vsftpd、sshd服务的启动状态,并关闭vsftpd服务
    • 启动bluetooth服务,然后使用kill命令终止其运行
    • 查找系统中CPU占用率超过80的进程,并强行终止该进程
    • 练习各种进程管理命令的使用
  • 设置计划运行的系统管理任务
    • 每周一早上7:50自动清空FTP服务器公共目录“/var/ftp/pub”
    • 每天晚上10:30分自动执行任务,保存磁盘使用情况信息
  • 查看所设置的计划任务列表