简介
在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文件内容
四、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] 时间格式
常用的参数选项
时间格式的几种表达
效果演示
> 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任务