linux学习36 任务计划crontab及企业实战应用

一、Linux任务计划,周期性任务执行

  1、在未来的某时间点执行一次某任务:at,batch

  2、周期性运行某任务:crontab

    执行结果:会通过邮件发送给用户。这个邮件服务只运行在本机上。

    

  3、在centos567中邮件服务都是默认开启的,默认监听端口为25

      可通过netstat -tnlp 或ss -tnl 查看

[root@node1 ~]# netstat -tnlp |grep 25
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1075/master         
tcp6       0      0 ::1:25                  :::*                    LISTEN      1075/master

  4、本地电子邮件服务

    a、smtp:simple mail transmission protocol。简单邮件传输协议,用于发送邮件但是不用来接收邮件。

    b、pop3:Post Office Procotol,邮局协议,3为版本号

      Imap4:Internet Mail Access Procotol 互联网邮件访问协议,4为其版本号

    c、mail命令

      mailx - send and receive Internet mail

      MUA:Mail User Agent,用户收发邮件的工具程序

        mailx [-s 'SUBJECT'(邮件的标题)] username[@hostname]  

        邮件正文的生成

          (1)、交互式输入;.单独成行可以表示正文结束;Ctrl + d提交亦可

          我们现在给centos用户发送一封邮件

[root@localhost ~]# mail -s 'hello centos' centos  #回车后输入邮件内容
How are you these days?
.   #点号表示结束编辑
EOT

          现在我们切换到用户centos查看邮件

[root@localhost ~]# su - centos   
Last login: Sat Feb 22 17:08:13 CST 2020 on pts/0
[centos@localhost ~]$ mail   #mail命令不带任何内容表示收邮件
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/centos": 1 message 1 new
>N  1 root                  Sat Feb 22 17:11  18/636   "hello centos" #N表示新邮件,1表示第一封新邮件
& 1  #按1表示查看第一封邮件
Message  1:
From root@localhost.localdomain  Sat Feb 22 17:11:24 2020
Return-Path: <root@localhost.localdomain>
X-Original-To: centos
Delivered-To: centos@localhost.localdomain
Date: Sat, 22 Feb 2020 17:11:24 +0800
To: centos@localhost.localdomain
Subject: hello centos
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R

How are you these days?  #这是邮件的内容,上面表示邮件相应的标题

& q  #q表示退出    
Held 1 message in /var/spool/mail/centos
You have mail in /var/spool/mail/centos

          (2)、通过输入重定向

            现在我们通过centos发送邮件给root,内容为/etc/fstab中的内容

[centos@localhost ~]$ mail -s 'fstab file' root < /etc/fstab 
[centos@localhost ~]$ exit
logout
You have mail in /var/spool/mail/root
[root@localhost ~]# mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 centos@localhost.loc  Sat Feb 22 17:19  28/1071  "fstab file"
& 1
Message  1:
From centos@localhost.localdomain  Sat Feb 22 17:19:57 2020
Return-Path: <centos@localhost.localdomain>
X-Original-To: root
Delivered-To: root@localhost.localdomain
Date: Sat, 22 Feb 2020 17:19:57 +0800
To: root@localhost.localdomain
Subject: fstab file
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: centos@localhost.localdomain
Status: R


#
# /etc/fstab
# Created by anaconda on Wed Oct 24 05:18:55 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=7b808363-4f9d-4f63-a543-28928b32c184 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

          (3)、通过管道。我们也可通过管道进行邮件发送

[root@localhost ~]# cat /etc/fstab | mail -s 'to you' centos 
You have mail in /var/spool/mail/root

二、周期性任务执行

  1、at [OPTION]... TIME

    a、TIME:

      (1)、HH:MM [YYYY-mm-dd]

      (2)、noon(中午,即中午十二点),midnight(午夜,即晚上十二点),teatime(午茶时间,即下午四点),tomorrow(即明天)

      (3)、now+ #

        UNIT:minutes,hours,days,OR weeks

        现在我们定义二分钟以后运行ls /var命令

[root@localhost ~]# at now+2min
at> ls /var
at> <EOT>   #使用ctrl + d提交
job 2 at Sat Feb 22 17:35:00 2020
[root@localhost ~]# at -l  #查看at任务
2    Sat Feb 22 17:35:00 2020 a root  

    b、at的作业队列,用单个字母表示,默认都使用a队列

    c、常用选项

      -l:查看作业队列,相当于atq

      -f /PATH/FROM/SOMEFILE:从指定文件中读取作业任务而不是交互式输入

[root@localhost application]# cat at.tasks 
cat /etc/inittab
echo "hello at command"
[root@localhost application]# at -f /application/at.tasks now+5min
job 3 at Sat Feb 22 17:46:00 2020
[root@localhost application]# atq
3    Sat Feb 22 17:46:00 2020 a root

      -d:删除指定的作业,相当于atrm

[root@localhost application]# atq
3    Sat Feb 22 17:46:00 2020 a root
[root@localhost application]# at -d 3
[root@localhost application]# atq

      -c:查看指定作业的具体内容

      -q QUEUE:指明队列;

    d、注意:作业执行结果是以邮件发送给提交作业的用户

  2、batch命令

    batch会让系统自行选择在系统资源较空闲的时间去执行指明的任务;

  3、周期性任务计划:cron

    a、服务程序:

      cronle:主程序包,提供了crond守护进程及相关辅助工具;

    b、确保crond守护进程(daemon)处于运行状态。

      (1)、centos7查看方式

[root@localhost application]# systemctl status crond.service 
● crond.service - Command Scheduler
   Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2020-02-22 17:06:27 CST; 51min ago
 Main PID: 706 (crond)
   CGroup: /system.slice/crond.service
           └─706 /usr/sbin/crond -n

Feb 22 17:06:27 localhost.localdomain systemd[1]: Started Command Scheduler.
Feb 22 17:06:27 localhost.localdomain systemd[1]: Starting Command Scheduler...
Feb 22 17:06:27 localhost.localdomain crond[706]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 18% if used.)
Feb 22 17:06:27 localhost.localdomain crond[706]: (CRON) INFO (running with inotify support)
You have new mail in /var/spool/mail/root

      (2)、centos6 查看方式:service crond status

          

 

     c、向crond提交作业的方式不同于at,它需要使用专用的配置文件,此文件有固定格式,不建议使用文本编辑器直接编辑此文件,要使用crontab命令

    d、cron任务分为两类

      (1)、系统cron任务:主要用于实现系统自身的维护;

        手动编辑:/etc/crontab文件

        系统cron的配置格式:

[root@localhost application]# cat /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root #邮件发给的用户

# For details see man 4 crontabs  #可以通过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

        注意:

          1)、每一行定义一个周期性任务,共7个字段

            * * * * * :定义周期性时间

            user-name:运行任务的用户身份

            command to be executed:任务

          2)、此处的环境变量不同于用户登陆后获取的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量

          3)、执行结果邮件发送给MAILTO指定的用户

      (2)、用户cron任务:

        命令:crontab命令

        也可手动编辑文件:/var/spool/cron/USERNAME

        注意:

          1)、每一行定义一个周期性任务,共6个字段

            * * * * * :定义周期性时间

            command to be executed:任务

          2)、此处的环境变量不同于用户登陆后获取的环境变量,因此,建议命令使用绝对路径,或者自定义PATH环境变量

          3)、执行结果邮件发送给当前用户

    e、时间表示法

      (1)、特定值:

        给定时间点有效取值范围内的值;

          注意:day of week和 day of month 一般不同时使用;

      (2)、*

        给定时间点上有效取值范围内的所有值:表示“每...”

          1)、每月每周每天每小时的每三分钟执行一次,即每小时的第三分钟

            3 * * * *    :每小时执行一次;每小时的第三分钟

          2)、每周五的四点三分执行一次:表示每周五的四点三分

            3 4 * * 5  :每周执行一次;每周5的4点3分

          3)、每月的七号的六点五分执行一次

            5 6 7 * *    :每月执行一次;每月的7号的6点5分

          4)、每年的十月九号八点七分执行一次

            7 8 9 10 *   :每年执行一次;每年的10月9号8点7分

      (3)、离散取值:, 

        在时间点上使用逗号分隔的多个值:#,#,#

          1)、每周三和周日的八点九分执行一次

            9 8 * * 3,7 :每周三和周日

          2)、每周三和周日的8点和20点各执行一次

            0 8,20 * * 3,7 :每周三和周日的8点和20点各执行一次。分钟的位置不能用*,如果用了就表示8点和20点的每分钟。

      (4)、连续取值:-

        在时间点上使用 - 连接开头和结束:#-#

          1)、周一到周五的每天的9点到18点执行一次

            0 9-18 * * 1-5 :工作时间内的每小时

      (5)、在指定时间点上,定义步长:/#,#即步长

          1)、每5分钟执行一次某任务

            */5 * * * * 

          2)、每7分钟执行一次某任务

            注意:

              i:指定的时间点不能被步长整除时,其意义将不复存在

              ii:对crontab来说最小时间单位为“分钟”,想完成“秒级任务”,得需要额外借助其它机制;定义成每分钟任务,而在利用脚本实现在每分钟之内循环执行多次。

  4、crontab命令

    crontab [-u user] [-l | -r | -e] [-i] [-s]

    a、相应选项

      -e:编辑任务

      -l:列出所有任务

      -r:移除所有任务:即删除/var/spool/cron/USERNAME文件

      -i:在使用-r选项移除所有任务时提示用户确认

      -u user:root 用户可为指定用户管理cron任务

[root@localhost /]# crontab -u centos -e
no crontab for centos - using an empty one
crontab: installing new crontab
You have new mail in /var/spool/mail/root
[root@localhost /]# cat /var/spool/cron/centos 
* * * * * /bin/echo "wohaoshuai"
[root@localhost /]# crontab -u centos -l
* * * * * /bin/echo "wohaoshuai"

    b、注意:运行结果以邮件通知给当前用户;如果拒绝接收邮件

      (1)、COMMAND > /dev/null  #将正确输出传送至/dev/null

      (2)、COMMAND &> /dev/null  #将所有的输出传送至/dev/null

    c、定义COMMAND时,如果命令中需要用到%,需要对其转义;但放置于单引号中的%不用转义亦可

    d、思考:某任务在指定的时间因关机未能执行,下次开机会不会自动执行?

      不会!

      如果期望某时间因故未能按时执行,下次开机后无论是否到了相应时间点都要执行一次,可使用anacron实现。

    课外作业: anacron及其应用

  5、练习:

    a、每12小时备份一次/etc目录至/backups目录中,保存文件名称格式为“etc-yyyy-mm-dd-hh.tar.xz”

    b、每周2、4、7备份/var/log/secure 文件至/logs目录中,文件名格式为“secure-yyyymmdd”

    c、每两小时取出当前系统/proc/meminfo文件中S或M开头的行信息追加至/tmp/meminfo.txt文件中

 

posted @ 2020-02-02 17:21  Presley  阅读(387)  评论(0编辑  收藏  举报