linu之任务计划crontab
文章目录
- 本地邮件服务
- at
- batch
- 周期性任务计划cron
- crontab 命令
在运维工作中,数据备份是至关重要的事情,基本每天都要做一次备份,使用linux
任务计划来进行是最合适的。
任务计划分为两种,一种是在未来某个时间点运行一次的任务,使用at
、batch
; 另一种是周期行的任务crontab
。
本地邮件服务
任务计划的执行结果默认会通过邮件发送给用户,这个邮件会并非是公网的邮件,而是本机用户之间互发的本地邮件服务器,每当用户登录的时候,就回收到邮件的提醒,邮件一般都是放在/var/spool/mail
目录下面。
所以就先学习下怎么在本机中收发邮件吧,花不了几分钟,当然直接跳过,也不影响后面的内容
在centos5/6/7
中邮件服务是默认开启的,端口是25
,可以使用ss -tnl
、netstat -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
可以终止输入并提交。
选项 | 作用 |
---|---|
TIME | noon: 中午十二点 midnight:午夜零点 teatime:下午四点,即十六点 HH:MM [YYYY-mm-dd] : 指定日期的时间点HH:MM tomorrow : 明天的指定时间点now+#UNIT : 当前时间往前# 个UNIT 单位的时间,UNIT 有minutes 、hours 、days 和weeks |
-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
任务分为以下两类:
- 系统任务:主要用于实现系统自身的维护,只能通过手动编辑
/etc/crontab
文件来实现,大部分时间下无需修改。 用户自定义任务,使用
crontab
命令来实现,配置文件保存在/var/spool/cron/USERNAME
文件, 每个用户都拥有一个单独的配置文件,格式和系统任务相同。[vagrant@nexus3 ~]$ cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=rootFor 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
配置文件的特点:
- 每行仅定义一个周期性任务
user-name
表示运行此任务的用户身份,用户自定义的cron
不需要此字段,用户身份就是用户本身command to be executed
对应要执行的任务- 此处的环境变量不同于用户登录后的环境变量,建议使用绝对路径,或自定义
PATH
环境变量。 - 执行结果以邮件发送给
MAILTO
指定的用户
每个任务之间的最小间隔时间单位为分钟,
cron
不支持秒级的任务,如果要使用秒级的周期性任务,需要额外借助于其他机制。
时间表示法:
- 给对应位上设置有效取值范围的值,如分钟的取值范围是
0-59
*
表示给定时间点上,有效取值范围内的所有值,意思是每...
3 * * * *
表示每个小时的第三分钟执行一次3 4 * * 5
表示每个周五的四点三分执行一次5 6 7 * *
表示每个7号的六点五分执行一次7 8 9 10 *
表示每个10月9号八点七分执行一次
离散取值,在时间点上用逗号分割的多个值,
#,#,#
9 8 * * 3,7
: 每周三和周日的八点九分0 8,,20 * * 3,7
每周三和周日的八点和二十点连续取值,在时间点上使用
-
连接开头和结束,#-#
0 9-18 * * 1-5
: 每个周一到周五的九点到18点的每个小时都执行一次在指定时间点上定义步长,
*/#
,需要注意的是在指定时间点上,不能被步长整除时,则周期任务的意义不复存在,只有能够被整除的步长值才能表达与我们理解相一致确切的含义,对于分钟来说只有*/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 任务无论成功还是失败,都不用发送邮件
还没有评论,来说两句吧...