关于java:Linux-定时任务调度crontab太实用了

38次阅读

共计 3263 个字符,预计需要花费 9 分钟才能阅读完成。

作者:悠悠 \
起源: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是每天执行一次的 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 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 开发手册(嵩山版)》最新公布,速速下载!

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

正文完
 0