作者:悠悠\
起源:http://uusama.com/827.html
概述
crontab命令用于设置周期性被执行的指令。该命令从规范输出设施读取指令,并将其寄存于“crontab”文件中,以供之后读取和执行。
能够应用crontab定时解决离线工作,比方每天凌晨2点更新数据等,常常用于零碎任务调度。
服务启动和敞开
个别Linux零碎中都会装有crontab
,如果没有装置能够应用包管理工具装置:
# vixie-cron 软件包是 cron 的主程序yum -y install vixie-cronyum -y install crontabs
crontab
服务的启动和敞开命令如下:
service crond start # 启动服务service crond stop # 敞开服务service crond restart # 重启服务service crond reload # 从新载入配置service crond status # 查看crontab服务状态# 能够应用上面的命令退出开机启动chkconfig --level 345 crond on
任务调度全局配置
crontab
全局任务调度配置在如下的目录:
cron.d/ cron.daily/ cron.deny cron.hourly/ cron.monthly/ crontab cron.weekly/
cron.daily
是每天执行一次的jobcron.weekly
是每个星期执行一次的jobcron.monthly
是每月执行一次的jobcron.hourly
是每个小时执行一次的jobcron.d
是零碎主动定期须要做的工作crontab
是设定定时工作执行文件cron.deny
文件就是用于管制不让哪些用户应用Crontab的性能
用户配置文件
每个用户都有本人的crontab
配置文件,应用crontab -e
命令进行编辑。保留后零碎会主动寄存与/var/spool/cron/
目录中,文件以用户名命名。
linux的crontab
服务每隔一分钟去读取一次/var/spool/cron
,/etc/crontab
,/etc/cron.d
上面所有的内容。
crontab命令一览:
crontab -e
: 编辑以后用户的定时工作列表crontab -l
: 查看以后用户的定时工作列表crontab -r
: 删除以后用户的定时工作列表
crontab定时工作格局
crontab每一条记录为一个定时工作,定时人遵循相应的定义规定。
其中后面的6个星号示意的含意如下:
minute
: 示意分钟,能够是从0到59之间的任何整数。hour
:示意小时,能够是从0到23之间的任何整数。day
:示意日期,能够是从1到31之间的任何整数。month
:示意月份,能够是从1到12之间的任何整数。week
:示意星期几,能够是从0到7之间的任何整数,这里的0或7代表星期日。command
:要执行的命令,能够是系统命令,也能够是本人编写的脚本文件。
每一个星号局部可用上面的特殊符号:
- 星号(*):通配符匹配,代表所有可能的值。
- 逗号(,):能够用逗号隔开的值指定一个列表范畴,例如,“1,2,5,7,8,9”。
- 中杠(-):能够用整数之间的中杠示意一个整数范畴,例如“2-6”示意“2,3,4,5,6”。
- 正斜线(/):能够用正斜线指定工夫的距离频率,例如“0-23/2”示意每两小时执行一次。同时正斜线能够和星号一起应用,例如*/10,如果用在minute字段,示意每十分钟执行一次。
crontab定时工作实例
工夫频次示例
上面列举罕用的工夫频次示例。
- 00 05 * : 每天凌晨5点执行
- 20 12 1,10,20 : 每个月的1号,10号,20号的12:30执行
- 10 1 6,0 : 示意每周六、周日的1:10分执行
- 0,30 18-23 * : 每天18:00至23:00之间每隔30分钟执行
- 0 23-7/1 * : 早晨11点到早上7点之间,每隔一小时执行
- 0 6-12/3 10 : 每年10月的每天早上6点到12点每隔3个小时执行一次
- 30 17 1-5 : 周一到周五下午5点30分执行一次
- 0 /2 : 每两个小时执行一次
比方咱们须要每天23点58分的时候执行一个更新数据的shell脚本,能够用crontab -e
命令在最初增加一行:
58 23 * * * sh /home/work/update.sh
输入输出重定向
在下面更新数据定时工作的实例中,如果执行update.sh的时候有错误信息输入,会输入到哪儿呢?
在没有配置输入重定向的时候,定时工作会见谬误输入到上面的文件:/var/log/mail/{$user}
,这是很不好的,咱们往往须要把不同的脚本输入到不同的日志文件,不便查看脚本的执行状况,这个时候须要应用输入重定向。
58 23 * * * sh /home/work/update.sh >> /home/work/log/update.log 2>&1
Linux中应用0-3
作为文件描述符来示意规范流。
名称 | 类型 | 文件描述符 | 操作 |
---|---|---|---|
stdin 规范输出 | standard input | 0 | < ,<< |
stdout 规范输入 | standard output | 1 | > ,>> |
stderr 规范谬误输入 | standard error output | 2 | 2> ,2>> |
在下面的定时工作脚本中,update.sh
前面的>>
示意将输入追加到update.log
文件中,2>&1
示意规范谬误输入重定向等同于规范输入
疏忽输出nohup
有时候咱们还会看到在定时工作脚本后面有一个nohup
的命令,该命令用于指定前面的脚本疏忽输出。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1
后盾执行&
无论是在控制台间接执行,还是在定时工作脚本中,咱们在某一条命令的最初面加上&
符号,示意以后命令在后盾运行,不占用控制台。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/update.log 2>&1 &
这里须要留神,如果执行的命令有期待输出的交互,把这个命令应用&
放在后盾运行时,它会始终期待输出,然而有没有输出,就卡住不动了。
工夫解决
再回顾下面的更新工作,它是将每一天的运行后果都重定向到update.log
文件,如果输入比拟多,咱们就须要每一天输入的不同的文件,能够通过在输入目录中指定日期用来宰割。如下:
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +\%Y\%m\%d".log` 2>&1 &# 或者上面的模式58 23 * * * nohup sh /home/work/update.sh >> "/home/work/log/update_"date +\%Y\%m\%d".log" 2>&1 &
这里应用date
函数,须要留神的是,crontab外面的脚本命令和间接在命令行运行的脚本可能是不一样的,尤其是date
函数中的%
须要本义。
能够间接在命令行运行上面命令:
sh /home/work/update.sh >> /home/work/log/update_`date +"%Y%m%d".log` 2>&1 &
达到和定时工作外面雷同的成果,都是输入到update_20181120.log
的文件。
然而如果间接在crontab中这样配置,则无奈辨认,不会执行该定时工作。上面的crontab工作是不会执行的,date函数将会报错。
58 23 * * * nohup sh /home/work/update.sh >> /home/work/log/`update_"date +%Y%m%d".log` 2>&1 &
近期热文举荐:
1.600+ 道 Java面试题及答案整顿(2021最新版)
2.终于靠开源我的项目弄到 IntelliJ IDEA 激活码了,真香!
3.阿里 Mock 工具正式开源,干掉市面上所有 Mock 工具!
4.Spring Cloud 2020.0.0 正式公布,全新颠覆性版本!
5.《Java开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞+转发哦!