作者:悠悠 \
起源:http://uusama.com/827.html
概述
crontab 命令用于设置周期性被执行的指令。该命令从规范输出设施读取指令,并将其寄存于“crontab”文件中,以供之后读取和执行。
能够应用 crontab 定时解决离线工作,比方每天凌晨 2 点更新数据等,常常用于零碎任务调度。
服务启动和敞开
个别 Linux 零碎中都会装有crontab
,如果没有装置能够应用包管理工具装置:
# vixie-cron 软件包是 cron 的主程序
yum -y install vixie-cron
yum -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 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!