2018-3-10Linux系统管理(9)任务计划

在这一章当中咱们讲述Linux任务计划以及周期性任务的执行。node

1、任务计划

  咱们此前说过一些备份的知识,假如在某种场景当中须要作备份,例如MySQL、Redis以及mongodb等数据管理系统或相关服务及程序,对于那些数据而言,若是要作周期备份的话,则必然就要用到该功能。在例如,对于公司来说,最关键的就是数据,而不是系统,由于只要数据还在,则能够快速创建一个系统,而若是数据不在,则没法创建出系统。因此数据备份是相当重要的一件事情。
  数据备份一般天天一次,甚至于每小时一次,那么这种任务咱们就称之为是周期性任务。还有一种就是在凌晨的时候,把某个目录一次性给复制到另外一台备份主机,若是这是周期性质的话,天天作一遍,那这就是周期性任务,若是说是为了每一个须要,只是作一次的话,那这种就是任务计划。
  他俩的本质没有太大的差异,有一些区别的就是一种在将来的某一个时间点执行一次任务,另外一种就是重复或周期性运行某任务,总结以下:
mongodb

   将来的某时间点执行一次某任务:at, batch
   周期性运行某任务:crontab
	  执行结果:会经过邮件发送给用户;

  对于Linux来说,周期性任务是要常常执行的,而单一的任务计划也是须要在将来的某一时刻进行运行,若是用户没有登陆在线的话,一旦任务执行完成,会经过邮件来发送给用户。这种电子邮件并不须要链接到互联网中,而是在本地系统上会启用一个邮件服务,这个服务只能用于本地用户与用户之间彼此传递信息。这种用户不在线时将执行结果经过邮件发送给用户,是一种很是行之有效的方式,这种邮件服务并非并非互联网那种公开的服务,而是仅仅保证本地用户在下一次登陆时的,该邮件执行的是推送消息结果的服务,因此说这个服务只能用于本机上来相互传递邮件消息。但若是要想工做起来,须要依赖两点,第一就是要启动该邮件服务,第二点就是有该用户临时的收发位置,不过好在CentOS中,默认都是开启本地邮件服务,咱们能够用netstat或者ss命令来查看某个服务25号端口是否开启。shell

# ss -tnl
State      Recv-Q Send-Q              Local Address:Port           Peer Address:Port                               
LISTEN        0   100                   ::1:25                :::*

  能够看出,25号端口处于监听开启状态,若是该端口开启的话,就说明服务运行正常。那么查看某个端口的命令以下:vim

   # netstat -tnlp
   # ss -tnl

1.1 mailx命令

  为了能查看任务往来的通讯结果及状况,咱们须要前提掌握关于邮件的收发命令,不然没法判断该任务计划到底执行与否,因此咱们来查看本地电子邮件服务。bash

   本地电子邮件服务:
	 smtp:simple mail transmission protocol
	 pop3:Post Office Protocol
	 imap4:Internet Mail Access Protocol

  以上的几种协议了解便可,咱们如今主要掌握的是如何在本地主机上收发邮件,其该命令为mail命令。它可以收发互联网邮件,是一个很强大的文本行界面的工具,它是一种用户收发邮件的一种工具程序,咱们称之为MUA,不论是WEB界面上的仍是字符界面上的,咱们都称之为用户收发的一种工具程序。
  要想使用mail或mailx命令收发邮件的话,方法是很简单的,该命令的格式为:
框架

   mail命令:
	 mailx - send and receive Internet mail
		
		 MUA: Mail User Agent,用户收发邮件的工具程序;
		
		 mailx [-s 'SUBJECT'] username[@hostname]

  好比说,写一个邮件发送给abc3用户,指明主题为'hello wuhuang!'编辑器

# mail -s 'hello wuhuang' abc3

  咱们看到,底下有一行空白处,这是系统等待用户输入内容后,按.进行单独一行发送,邮件发送完成。因此说该命令是这样的。ide

# mail -s 'hello wuhuang' abc3
wuhuangwansui!
.
EOT

  以后咱们切换abc3,使用mail命令查看邮件是否存在,须要注意的是,mail不带任何选项是收邮件及查看邮件的,N表示为新邮件,按相关序号就能进行查看,那么看完以后按q键退出。工具

# su - abc3
$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/abc3": 1 message 1 new
>N  1 root                  Sat Mar 10 19:43  18/580   "hello wuhuang"
& 1
Message  1:
From root@node1.china.org  Sat Mar 10 19:43:18 2018
Return-Path: <root@node1.china.org>
X-Original-To: abc3
Delivered-To: abc3@node1.china.org
Date: Sat, 10 Mar 2018 19:43:17 +0800
To: abc3@node1.china.org
Subject: hello wuhuang
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@node1.china.org (root)
Status: R

wuhuangwansui!

& q
Held 1 message in /var/spool/mail/abc3
You have mail in /var/spool/mail/abc3

  咱们还能够自动给邮件给予正文,咱们刚才是使用mail命令下的交互式模式中写出正文,只要是从标准输入获取的数据,咱们可使用管道以及重定向来解决自动给予正文的问题。好比咱们使用abc3用户给root发送一个文件fatab的内容,标题为‘fstab file’ui

$ mail -s 'fstab file' root < /etc/fstab

  还有一种是经过管道,好比说使用cat命令来查看fstab文件,经过管道送入mail命令。

$ cat /etc/fstab | mail -s 'fatab files' root

  咱们退回到root用户使用mail命令查看。

# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 2 messages 2 new
>N  1 abc3@node1.china.org  Sat Mar 10 20:14  29/1153  "fstab file"
 N  2 abc3@node1.china.org  Sat Mar 10 20:18  29/1154  "fstab files"
&

  那么咱们总结一下邮件正文的生成:

			邮件正文的生成:
				(1) 交互式输入;.单独成行能够表示正文结束;Ctrl+d提交亦可。
				(2) 经过输入重定向;
				(3) 经过管道;

  那么咱们接下来说述一下周期性任务,以及讲述一下在将来的某一个时刻执行一次某种任务。

2、at命令

  at的命令用法其实很简单,就是使用at命令跟上一些选项,以后选择在将来的某个时刻执行,其命令格式以下:

   at [OPTION]... TIME

  而TIME的使用格式及方法以下:

    TIME: 
    	HH:MM [YYYY-mm-dd]
    	noon, midnight, teatime
    	tomorrow
    	now+#
	    	UNIT: minutes, hours, days, OR weeks

  好比说一分钟后运行ls命令,输入完成以后,使用Ctrl+d快捷键退出。而任务是能够写入多个的,在将来的某一时刻中同时运行。

# at now+1min 
at> ls
at> <EOT>
job 1 at Sat Mar 10 20:48:00 2018

  咱们使用mail命令能够查看运行结果。

# mail
>N  3 root                  Sat Mar 10 20:48  28/607   "Output from your job        1"
& 3
Message  3:
From root@node1.china.org  Sat Mar 10 20:48:01 2018
Return-Path: <root@node1.china.org>
X-Original-To: root
Delivered-To: root@node1.china.org
Subject: Output from your job        1
To: root@node1.china.org
Date: Sat, 10 Mar 2018 20:48:01 +0800 (CST)
From: root@node1.china.org (root)
Status: R

admin
admin.txt
anaconda-ks.cfg
Desktop
Documents
Downloads
EOF
httpd-2.4.25.tar.gz
initial-setup-ks.cfg
Music
Pictures
Public
scripts
Templates
Videos

&

  那么咱们须要注意的是,当多个用户执行任务管理繁杂时,以队列的形式用来管理,默认为a队列。

   at的做业有队列,用单个字母标识,默认都使用a队列。

  at命令的经常使用选项以下:

	经常使用选项:
		-l:查看做业队列,至关于atq;
		-f /PATH/TO/SOMEFILE:从指定文件中读取做业任务,而不用在交互式输入;
		-d:删除指定做业,至关于atrm;
		-c:查看指定做业的具体内容;
		-q QUEUE:指明队列;
	
	注意:做业执行结果是以邮件的形式发送给提交做业的用户;

  那么咱们在文件中编写任务,交给at命令在两分钟以后执行,这样的话不须要用户进行交互,步骤以下:

# vim at.tasks
echo "Hello World"
echo "Do you like one you see?"
echo "Boy next door!"

# at -f at.tasks now+2min

2.1 batch命令

  batch和at命令是同样的,但二者不一样之处在于batch命令不像at命令同样,指定做业在某个时间运行,而是让系统自行选择,在系统较为空闲的时间去执行指定的任务。也就是说,不用指定时间了,但其它的使用方法与at命令基本相同。

3、周期性任务

  周期性任务计划采用的是cron机制,对于cron而言,必须有一种机制到达某种时间执行将其结果进行提交,这种机制就是一种服务,咱们须要这种服务一直出于运行状态,而这种服务一直运行在后台,而这种服务须要检查那些任务该执行,因此说这是须要一种服务程序,始终监听并查看对应的时间点去运行的任务是否符合条件,然后将其运行,这种服务程序,在系统上所依靠的程序包为cronle,提供了crond守护进程及相关辅助工具。

   周期性任务计划:cron
	   服务程序:
		   cronle:主程序包,提供了crond守护进程及相关辅助工具;
	
	   确保crond守护进程(daemon)出于运行状态:
		   CentOS 7
			   # systemctl status crond.service
				   Active: active (running)... ...
		
		   CentOS 6
			   # service crond status
				   ... is running.

  只有以上两种守护进程出于运行状态,咱们才能保证其在运行计划中的任务才能能够实现,所以也要像at命令同样,也是须要提交一个或多个任务做业给crond,只不过提交crond做业的方式不一样于at,它是须要使用专用的配置文件,该文件有固定的格式,不过不建议使用文本编辑器直接编辑此文件;可以使用crontab命令来解决此问题。该命令会自动检查语法错误,一旦发现有什么错误时,会发出提示或直接拒绝提交。
  而cron任务共分为两类,一种是系统cron的任务,是为了系统完成自身的维护任务,另外一种是用户cron任务,是为了用户的某个须要来实现的。总结以下:

   向crond提交做业的方式不一样于at,它须要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件;要使用crontab命令。
      cron任务分为两类:
           系统cron任务:主要用于实现系统自身的维护;
               手动编辑:/etc/crontab文件;
           用户cron任务:
               命令:crontab命令;

  对于第一种系统任务来说,咱们不须要手动进行编辑,在系统安装的时候,该任务就会建立完成,咱们无需指定,但用户cron是咱们须要使用的,而且须要遵照该任务的格式即标准。
  咱们如今查看一下系统的cron任务的配置文件,该路径在/etc/目录下。

系统cron的配置格式:
    # cat /etc/crontab 
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root

    # 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
    # |  |  |  |  |
    # *  *  *  *  * user-name  command to be executed
   SHELL:指定shell解释器所运行的脚本或命令;
   PATH:指定某种路径去寻找该命令,不过因为路径太少,能够在写任务时使用绝对路径,或自定义PATH环境变量;
   MAILTO:运行任务的执行结果经过邮件发送给用户,默认为发送给root;

  虽然系统cron配置文件基本不须要更改,或者说不多编辑,可是咱们须要了解一下cron文件具体的每一行的解释,记住它的要点。

   注意:
       (1) 每行定义一个cron任务,共7个字段;
           *  *  *  *  * :定义周期性时间;
           user-name:运行任务的用户身份;
           command to be executed:任务
        
       (2) 此处的环境变量不一样于用户登陆后得到的环境,所以,建议命令使用绝对路径,或者自定义PATH环境变量;
       (3) 执行结果邮件发送给MAILTO指定的用户;

  以上就是系统cron的配置,那么接下来咱们说一下用户cron的配置。对于用户cron来说,没有username这一项了,而用户cron的配置文件的路径在:/var/spool/cron/USERNAME。因此在用户cron当中则不须要用户名这一项了。

用户cron的配置格式:
    SHELL=/bin/bash
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root

    # 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

  咱们须要注意的是,系统cron文件和用户cron文件略有区别,其总结以下:

    注意:
        (1) 每行定义一个cron任务,共6个字段;
        (2) 此处的环境变量不一样于用户登陆后得到的环境,所以,建议命令使用绝对路径,或者自定义PATH环境变量;
        (3) 邮件发送给当前用户;

  那么文件格式大致从以上的框架中进行了解,那么接下来咱们如何指定时间点。

3.1 时间表示法

  对于用户cron和系统cron来讲,都是通用的,那么如何指定时间点来讲,有如下实现机制:

   (1) 特定值:
     给定时间点有效取值范围内的值;
         注意:day of week和day of month通常不一样使用;
        
   (2) *
     给定时间点有效取值范围内的全部值:表"每..";找时间点最小的*
     
   (3) 离散取值:,
     在给定的时间点上使用逗号分开多个值便可;
         #,#,#
        
   (4) 连续取值:
     在时间点上使用-链接开头和结束;
         #-#

   (5) 在制定时间点上,定义步长;
        /#:#即步长;
        
        注意:
            (1) 指定的时间不能被步长整除时,其意义将不复存在;
            (2) 最小时间单位为"分钟",想完成"秒"级任务,得须要额外借助于其它机制;
                定义成每分钟任务:而在利用脚本实如今每分钟以内,循环执行屡次;

  示例:

    (1) 3 * * * *:每小时执行一次,每次为三分钟;
    (2) 4 3 * * 5:每周执行一次;每周5的4点3分;
    (3) 5 6 7 * *:每个月执行一次;每个月7号的6点5分;
    (4) 7 8 9 10 *:每一年执行一次,每一年10月9号8点7分;
    (5) 9 8 * * 3,7:每周三和周日;
    (6) 0 8,20 * * 3,7
    (7) 0 9-18 * * 1-5
    (8) */5 * * * *:每五分钟执行一次某任务;

3.2 crontab命令

  若是某个用户想定义cron任务,咱们就可使用crontab命令就能够了,其命令格式为:

    crontab命令:
        crontab [-u user] [-l | -r |-e][-i]

  该命令选项为:

   -e:编辑任务;
   -l:列出全部任务;
   -r:移除全部任务;即删除/var/spool/cron/USERNAME文件;
   -i:在使用-r选项移除全部任务时提示用户确认;
   -u user:root用户可为指定用户管理cron任务;

  须要注意的是,不能使用vim编辑器来编写任务计划,由于不能检查其语法错误。
  若是你运行的结果没有问题时,能够选择不接收邮件。

   注意:运行结果以邮件通知给当前用户;若是拒绝接收邮件:
      (1) COMMAND > /dev/null
      (2) COMMAND &> /dev/null

  还须要注意一点的是:

   注意:定义COMMAND时,若是命令须要用到%,须要对其转义;但放置于单引号中的%不用转义亦可;
相关文章
相关标签/搜索