crontab常见于Unix和类Unix的操做系统之中,用于设置周期性被执行的指令。编辑好的crontab会被存放于“crontab”文件中,以供以后读取和执行。每一个用户能够拥有本身的crontab文件。一般,crontab存储的指令被守护进程crond激活,crond经常在后台运行,每分钟检查是否有预约的做业须要执行。sql
(1) crontab -e : 修改crontab文件。若是文件不存在会自动建立 (2) crontab -l : 显示crontab文件。 (3) crontab -r : 删除crontab文件。 (4) crontab -ir : 删除crontab文件前提醒用户
{minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} minute: 区间为0-59 hour: 区间为0-23 day-of-month: 区间为0-31 month: 区间为1-12,1是1月,12是12月 day-of-week: 区间为0-7,周日能够是0或7
示例:shell
(1)在天天00:01运行,即天天凌晨过一分钟。网络
1 0 * * * /root/bin/hello.sh
(2)每一个工做日(Mon - Fri)11:59PM运行操作系统
59 23 * * 1,2,3,4,5 /root/bin/hello.sh
(3)下面例子与上面的例子效果同样code
59 23 * * 1-5 /root/bin/hello.sh
(4)每5分钟运行一次进程
*/5 * * * * /root/bin/hello.sh
(5)每月的第一天1:10pm运行crontab
10 13 1 * * /root/bin/hello.sh
(6)每一个工做日11:00pm运行ip
0 23 * * 1-5 /root/bin/hello.sh
正确写法:io
*/60 * * * * /root/bin/hello.sh
如下均为错误写法:class
0 * * * * /root/bin/hello.sh # 每小时的0分运行。虽然也是每小时运行一次,可是若是我是在10:20建立crontab,应该在11:20运行,而不是11:00
0 */1 * * * /root/bin/hello.sh # 和上面同样
* */1 * * * /root/bin/hello.sh # 更加错误的写法,分钟要求的是每分钟执行,而小时却要求每小时执行,最终以分钟为准。所以每分钟执行一次。
在简介中有提到过,crond守护进程每分钟检查一次是否有预约的做业须要执行,所以crontab没有办法直接作到每秒运行一次,最少每分钟运行一次。可是咱们能够经过增长sleep语句来达到每秒执行的效果。
以每30s执行一次为例:
* * * * * /root/bin/hello.sh * * * * * sleep 30; /root/bin/hello.sh
第二条crontab虽然与第一条同时被crond执行,可是须要延迟30s,经过延迟执行的方式达到了每30s执行一次的效果
同理,每10s执行一次:
* * * * * /root/bin/hello.sh * * * * * sleep 10; /root/bin/hello.sh * * * * * sleep 20; /root/bin/hello.sh * * * * * sleep 30; /root/bin/hello.sh * * * * * sleep 40; /root/bin/hello.sh * * * * * sleep 50; /root/bin/hello.sh
若是要达到每秒执行一次,则须要添加60条crontab,这里就不赘述,留给你们本身思考叭(◕‿◕✿)
crontab在执行的过程当中,可能因为任务执行错误或者在下一个任务开始前,前一个任务没有执行完成,致使大量的进程产生,最终可能致使死机等状况产生。
以前作过一个告警外发的需求,要求实时的把最新告警给外发出去。这里我用的就是crontab,可是因为sql查询速度和网络延迟等状况,可能上一次的外发尚未执行完,下一次的外发就开始了,致使有些告警被重复外发。这里就可使用flock来解决这个问题。
flock的本质是给某个crontab加锁,若是第二个进程发现这个crontab有锁,就会放弃执行。
flock [-sxon][-w #] file [-c] command -s, --shared: 得到一个共享锁 -x, --exclusive: 得到一个独占锁 -u, --unlock: 移除一个锁,一般是不须要的,脚本执行完会自动丢弃锁 -n, --nonblock: 若是没有当即得到锁,直接失败而不是等待 -w, --timeout: 若是没有当即得到锁,等待指定时间 -o, --close: 在与逆行命令前关闭文件的描述符号,用于若是命令产生子进程时会不受锁的管控 -c, --command 在shell中运行一个单独的命令 -h, --help 显示帮助 -V, --version 显示版本
任务举例:
# hello.lock为是一个锁临时文件 * * * * * flock -xn /root/bin/hello.lock -c '/root/bin/hello.sh' * * * * * sleep 30; flock -xn /root/bin/hello.lock -c '/root/bin/hello.sh'
好啦,关于crontab的使用方法就这些啦,若有补充,欢迎评论区留言(●'◡'●)