linu之任务计划crontab

在运维工作中,数据备份是至关重要的事情,基本每天都要做一次备份,使用linux任务计划来进行是最合适的。

任务计划分为两种,一种是在未来某个时间点运行一次的任务,使用atbatch; 另一种是周期行的任务crontab

本地邮件服务

任务计划的执行结果默认会通过邮件发送给用户,这个邮件会并非是公网的邮件,而是本机用户之间互发的本地邮件服务器,每当用户登录的时候,就回收到邮件的提醒,邮件一般都是放在/var/spool/mail目录下面。

所以就先学习下怎么在本机中收发邮件吧,花不了几分钟,当然直接跳过,也不影响后面的内容

centos5/6/7中邮件服务是默认开启的,端口是25,可以使用ss -tnlnetstat -tnl 或者netstat -tnpl 来查看。

mail 用于收发邮件的命令,是一个用户邮件代理mail user agent,帮助用户实现邮件收发的命令工具,功能类似web邮件客户端、foxmail等这种。

使用格式: mail [-s "subject"] username[@localhost]

mail命令不带任何参数时,表示收邮件,然后输入邮件的编号,就可以看到邮件的内容,

[vagrant@nexus3 ~]$ mail -s "test subject"  user2        # 发送一封邮件给用户 user2
How are you , user2
.                          # 单独一行,前后没有空格的点好表示邮件写完了,回车后就回自动发送
EOT
[vagrant@nexus3 ~]$ su - user2       # 切换到 user2 , 查看邮件
Password: 
Last login: 日 6月 14 04:03:06 UTC 2020 on pts/1
[user2@nexus3 ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/user2": 1 message 1 new           # 可以看到有一封未读邮件
>N  1 vagrant               Mon Jun 22 16:19  18/619   "test subject"
& 1                                               # 输入编号 1 ,查看邮件
Message  1:
From vagrant@nexus3.localdomain  Mon Jun 22 16:19:41 2020
Return-Path: <vagrant@nexus3.localdomain>
X-Original-To: user2
Delivered-To: user2@nexus3.localdomain
Date: Mon, 22 Jun 2020 16:19:41 +0000
To: user2@nexus3.localdomain
Subject: test subject
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: vagrant@nexus3.localdomain (vagrant)
Status: R

How are you , user2

& q                 # 输入 q 退出
Held 1 message in /var/spool/mail/user2

直接在命令行里编辑邮件比较不方便,还可以通过其他的两种方式来发送邮件。

  • 使用输入重定向:mail -s "fstab" user2 < /etc/fstab
  • 使用管道 : cat /etc/fstab | mail -s "to user2" user2

at

前面说过,at用来设定在未来某个时间点运行一次的任务,at的作业有队列的概念,队列用单个字符表示,默认都是使用a队列。

命令格式: at [option] TIME,输入命令后,终端会等待输入要执行作业的具体内容,Ctrl+d可以终止输入并提交。

选项作用
TIMEnoon: 中午十二点
midnight:午夜零点
teatime:下午四点,即十六点
HH:MM [YYYY-mm-dd] : 指定日期的时间点
HH:MM tomorrow : 明天的指定时间点
now+#UNIT : 当前时间往前#UNIT单位的时间,UNITminuteshoursdaysweeks
-l列出所有待执行的作业列表
-f从指定的文件中读取作业任务,而不用交互式输入
-d #删除指定编号#的作业任务,等同于命令atrm
-c #查看指定编号任务的具体内容
-q QUEUE查看指定队列的任务
[vagrant@nexus3 ~]$ at now+3minutes
at> ls -l
at> echo "可以的"
at> <EOT>
job 5 at Mon Jun 22 17:07:00 2020
[vagrant@nexus3 ~]$ at -l
5	Mon Jun 22 17:07:00 2020 a vagrant
[vagrant@nexus3 ~]$ at teatime
at> echo "teatime"
at> <EOT>
job 6 at Tue Jun 23 16:00:00 2020
[vagrant@nexus3 ~]$ at -l
5	Mon Jun 22 17:07:00 2020 a vagrant   # 5是作业编号 , a 是默认队列 ,vagrant表示执行用户
6	Tue Jun 23 16:00:00 2020 a vagrant
[vagrant@nexus3 ~]$ at -d 6
[vagrant@nexus3 ~]$ at -l
5	Mon Jun 22 17:07:00 2020 a vagrant

batch

batch命令跟at是一样的,唯一的区别在于batch会让系统自行选择,资源较空闲的时候去执行指定的任务。

周期性任务计划cron

为了保证周期性的任务可以按照指定的时间执行,会有一个专门的服务一直在监控时间是否满足执行条件。

程序包cronle提供了crond守护进程及相关服务中工具,首先来确认下crond守护进程(daemon)是否处于运行状态。

centos7使用systemctl status crond来查看crond守护进程的状态。

centos5/6使用service crond status来查看crond守护进程的状态。

cron任务分为以下两类:

  1. 系统任务:主要用于实现系统自身的维护,只能通过手动编辑/etc/crontab文件来实现,大部分时间下无需修改。
  2. 用户自定义任务,使用crontab命令来实现,配置文件保存在/var/spool/cron/USERNAME 文件, 每个用户都拥有一个单独的配置文件,格式和系统任务相同。
[vagrant@nexus3 ~]$ 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

cron配置文件的特点:

  1. 每行仅定义一个周期性任务
  2. user-name表示运行此任务的用户身份,用户自定义的cron不需要此字段,用户身份就是用户本身
  3. command to be executed对应要执行的任务
  4. 此处的环境变量不同于用户登录后的环境变量,建议使用绝对路径,或自定义PATH环境变量。
  5. 执行结果以邮件发送给MAILTO指定的用户

每个任务之间的最小间隔时间单位为分钟,cron不支持秒级的任务,如果要使用秒级的周期性任务,需要额外借助于其他机制。

时间表示法:

  1. 给对应位上设置有效取值范围的值,如分钟的取值范围是0-59

  2. *表示给定时间点上,有效取值范围内的所有值,意思是每...

    • 3 * * * * 表示每个小时的第三分钟执行一次
    • 3 4 * * 5 表示每个周五的四点三分执行一次
    • 5 6 7 * * 表示每个7号的六点五分执行一次
    • 7 8 9 10 * 表示每个10月9号八点七分执行一次
  3. 离散取值,在时间点上用逗号分割的多个值,#,#,#

    9 8 * * 3,7 : 每周三和周日的八点九分

    0 8,,20 * * 3,7 每周三和周日的八点和二十点

  4. 连续取值,在时间点上使用-连接开头和结束,#-#

    0 9-18 * * 1-5 : 每个周一到周五的九点到18点的每个小时都执行一次

  5. 在指定时间点上定义步长,*/#,需要注意的是在指定时间点上,不能被步长整除时,则周期任务的意义不复存在,只有能够被整除的步长值才能表达与我们理解相一致确切的含义,对于分钟来说只有 */2,*/3,*/4,*/5,*/6,*/10,*/12,*/15,*/30,对于小时来说则只有*/2,*/3,*/4,*/6,*/8,*/12。对于日期来说,如果使用*/5,则不能保证每5天执行一次,到月底的时候可能只执行1天、2天或3天后就停止了,这取决与大小月与平闰年。这是因为 cron 是没有状态的,它不能够记录上次执行的是什么时间,只能根据当前的时间来判断是否需要执行。

    而对于*/13 * * * *这个例子来说,表示在分钟这个范围内,即0-59分钟,任务会每13分钟执行一次。即:0,13,26,39,52,之后再间隔8分钟,就会又重新执行。

    再看下面一个例子:0 6 */2 * * /command,如果理解成每两天的6点钟执行命令。在这里*的范围是1-31*/2表示任务在奇数天执行,那么在1、3、5、7、8、10、12月,月末最后一天执行后,紧接着第二天仍然后执行,那这就不是每2天执行一次。

crontab 命令

命令格式crontab [-u username] [-l | -r | -e ] [-i] [-s]

选项作用
-e编辑任务,自带语法检查
-l列出所有任务
-r移除全部任务,即删除/etc/spool/cron/URERNAME文件
-i在使用-r移除全部任务的时候,给出提示确认操作
-u USERNAMEroot可以为指定用户管理cron

如果要删除某一个任务,直接使用-e,在编辑中删除即可。

如果想拒收邮件,可以使用如下操作:

  • COMMAND > /dev/null 执行失败发送邮件,成功就不用发送了
  • COMMAND &> /dev/null 任务无论成功还是失败,都不用发送邮件
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值