[RHEL7基础篇-16] Linux中的crontab和at
简介
在Linux中,crontab和at是两种常用的任务调度工具。crontab:crontab是一种用于定期执行任务的工具。at是一种用于单次执行任务的工具。需要注意crontab和at的时间设定格式略有不同,下面我们一起来学习一下Linux中的crontab和at。
服务管理
1、crontab的服务管理
RHEL5、RHEL6版本只可以使用该命令
> service crond {start|stop|status|reload|restart}
RHEL7版本使用该命令
> systemctl restart/start/stop/status/reload crond.service
2、at的服务管理
RHEL5、RHEL6版本只可以使用该命令
> service atd {start|stop|status|reload|restart}
RHEL7版本使用该命令
> systemctl restart/start/stop/status/reload atd.service
命令使用如下图所示
用户crontab
一、常见的一些实用命令
设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
> crontab -u
列出某个用户cron服务的详细内容
> crontab -l
删除某个用户的cron服务
> crontab -r
编辑某个用户的cron服务
> crontab -e
二、allow和deny
1、哪些人可以使用crontab
> vim /etc/cron.allow # 一行为一个用户,直接写用户名即可,在里头的用户被允许,不在的被拒绝
2、哪些人不可以使用crontab
> vim /etc//cron.deny # 在里头的用户被拒绝,不在的被允许
allow的优先级比deny来的高,在系统中只要有一个文件存在即可,两个都不存在时,只有root可用crontab
三、crontab文件内容
列数 | 定义 |
---|---|
第1列 | 表示分钟,1~59 (每分钟用*或者 */1表示,0表示0分) |
第2列 | 表示小时,1~23(0表示0点) |
第3列 | 表示日期,1~31(1表示每个月的1号,*表示任意这个月内任意一天) |
第4列 | 表示月份,1~12(1表示每年的1月,*表示任意一个月) |
第5列 | 标识号星期0~7(0和7表示星期天) |
第6列 | 要运行的命令 |
四、crontab日志与备份
1、crontab的日志目录
总有人质疑你的crontab中的脚本是否在运行,这个时候就要看看是否有最新的日志生成就能知道了
我们需要从/var/log/cron确认
> cd /var/log/cron # cron为日志文件,如果有多个crontab在运行则会生成多个cron文件,如:cron cron.1 cron.2 cron.3 cron.4
cron日志文件会记录该crontab执行的命令和时间,根据该日志可以推断出所配置的crontab的参数,从而恢复丢失的crontab,但如果周期过长则可能无法恢复,这时候我们就要即使采取备份措施
备份措施如下:
使用的crontab备份,备份文件/var/spool/cron/用户名
> crontab -e
0 0 * * 1 crontab -l > /var/spool/cron/root # 每周一把crontab -l的内容输入到/var/spool/cron/root中
衍生问题
在生产环境中有时,需要更短的周期,比如每隔几秒,甚至更短,而我们crontab运行周期的最小单位为一分钟。在我们的生产环境中,一个mysql集群由于要比较及时知道节点DB的健康状况,我们就是要求要每过5秒钟就要汇总一下信息,以便将不健康的节点DB踢出集群,同时将业务查询分配给健康的节点DB!
这个时候就需要Shell脚本使用了
#!/bin/bash
while [1 != 0] # 做的是一个无限的while循环
do
echo "###########" >>/tmp/123 # 把###########输入到/tmp/123中
sleep 0.5 # 休眠0.5秒
date >>/tmp/123 # 把当前时间输入到/tmp/123中
done
#!/bin/bash
while [1 != 0]
do
echo "###########" >>/tmp/123 # 把###########输入到/tmp/123中
sleep 1 # 休眠1秒
date >>/tmp/123 # 把当前时间输入到/tmp/123中
done
可以观察到这123这个文件中出现相同时间出现的次数(sleep 0.5的相同秒数会出现2个,sleep 1的相同秒数只有一个),在死循环中 要记得sleep,要不然机器负载会跑的很高的负载,
最后down机!
系统crontab
系统的crontab所在位置为/etc/crontab,内容如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly # 每个小时
02 4 * * * root run-parts /etc/cron.daily # 每天
22 4 * * 0 root run-parts /etc/cron.weekly # 每个星期
42 4 1 * * root run-parts /etc/cron.monthly # 每个月
下面这些脚本当中,就有我们会提到的系统日志轮转功能
> vim /etc/cron.daily/mlocate.cron # locate查找文件,其配置文件/etc/updatedb.conf,每天运行后,会放入/var/lib/mlocate/mlocate.db
echo "DAILY_UPDATE=no" >> /etc/updatedb.conf
一次性任务at
使用at前一定要先启动atd服务,请看本节的服务管理
at [-option] 时间格式
常用的参数选项
选项 | 定义 |
---|---|
-m | 若at内的shell命令没有任何输入信息,也发送email给at任务使用者 |
-l | 查看当前的队列,相当于atq |
-d | 取消正在at队列中的一项任务,相当于atrm |
-v | 可以使用较明显的时间格式列出at计划中的任务列表 |
-c | 后面跟任务编号,列出该任务的内容 |
时间格式的几种表达
代码 | 定义 |
---|---|
HH:MM | 小时:分钟 |
HH:MM YYYY-MM-DD | 小时:分钟 年:月:日 |
HH:MM[am/pm] [Month] [Date] | 小时:分钟[上午/下午] [月] [日] |
HH:MM[am/pm] + number [minuter/hours/days/weeks] | 小时:分钟[上午/下午] + 时间(即在某个时间点之后再过多久才执行) |
now | 表示现在的时间 |
效果演示
> date
> cat /tmp/test_at
> at now +2 minutes # +2 (minutes,hours,days,weeks) 可以是分、时、日、周
at> date >> /tmp/test_at
at> <EOT> # 中间在输入完要执行的脚本后,以Ctrl+D的形式,结束编辑
> atq # 查看当前的队列
> date
> cat /tmp/test_at
> atrm 1# 指的是job序列号,atq用来查看目前的队列,下图中atq的第一列即为job序列号
注:避开白天时候的高峰进行作业,例如数据的迁移,他只要一次运行即可了,而且是在将来的某一时刻开启运行即可,写在crontab中明显不合适,有时会忘记了删掉crontab,导致他第二次运行,这是我们所不希望看到的!
练习
1、 root用户每周一4,5,6,8点00分 运行date >>/tmp/dbrecover.log
2、新建一个用户cronuser,写入/etc/cron.allow 和/etc/cron.deny文件中,则该用户能否编写1中的crontab任务