linu之任务计划crontab

叁歲伎倆 2023-02-20 06:19 88阅读 0赞

文章目录

  • 本地邮件服务
  • at
  • batch
  • 周期性任务计划cron
  • 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命令不带任何参数时,表示收邮件,然后输入邮件的编号,就可以看到邮件的内容,

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


































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

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

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

  • COMMAND > /dev/null 执行失败发送邮件,成功就不用发送了
  • COMMAND &> /dev/null 任务无论成功还是失败,都不用发送邮件

发表评论

表情:
评论列表 (有 0 条评论,88人围观)

还没有评论,来说两句吧...

相关阅读