作者:悠悠\
起源: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是每天执行一次的job
  • cron.weekly是每个星期执行一次的job
  • cron.monthly是每月执行一次的job
  • cron.hourly是每个小时执行一次的job
  • cron.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 input0<,<<
stdout 规范输入standard output1>,>>
stderr 规范谬误输入standard error output22>,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开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞+转发哦!