场景:有时需要临时统计线上的数据,然后导出到 Excel 表格中。这种需求有时较为复杂,光靠写 SQL 语句是无法满足需求的,这就需要写 Java 代码了。然后将该程序打成一个 Jar 包,在线上环境执行,最后将生成的 Excel 文件下载到本地。
为了减小对线上环境的影响,我们一般会选择在凌晨 1-2 点 ,趁用户量少的时候,执行统计程序。由于时间太晚了,我们完全没必要守在那里等执行结果,一个定时任务就能可以搞定。那么,这种情况用哪种定时任务更合适呢?
答案是: Linux 系统的 crontab 运行 crontab -e ,可以编辑定时器,然后加入如下命令:
0 2 * * * /jdk1.8/bin/java -jar /data/app/tool.jar > /logs/tool.log &
就可以在 每天凌晨 2 点 ,定时执行 tool.jar 程序,并且把日志输出到 tool.log 文件中。当然你也可以把后面的执行 Java 程序的命令写成 Shell 脚本,更方便维护
使用这种定时任务支持方便修改定时规则,有界面可以统一管理配置的各种定时脚本
crontab 命令的基本格式如下:
crontab [参数] [文件名]
参数功能对照表如下:
| 参数 | 功能 |
|---|---|
| -u | 指定用户 |
| -e | 编辑某个用户的 crontab 文件内容 |
| -l | 显示某个用户的 crontab 文件内容 |
| -r | 删除某用户的 crontab 文件 |
| -i | 删除某用户的 crontab 文件时需确认 |
以上参数,如果没有使用 -u 指定用户,则默认使用的当前用户
通过 crontab -e 命令编辑文件内容,具体语法如下:
[分] [小时] [日期] [月] [星期] 具体任务
其中:
还有一些特殊字符,比如:
* 代表任何时间,比如:*1*** 表示每天凌晨 1 点执行
/ 代表每隔多久执行一次,比如: */5**** 表示每隔 5 分钟执行一次
, 代表支持多个,比如: 10 7,9,12 *** 表示在每天的 7、9、12 点 10 分各执行一次
- 代表支持一个范围,比如: 10 7-9 *** 表示在每天的 7、8、9 点 10 分各执行一次
crontab 需要 crond 服务支持, crond 是 Linux 下用来周期地执行某种任务的一个守护进程,在安装 Linux 操作系统后,默认会安装 crond 服务工具,且 crond 服务默认就是自启动的。 crond 进程每分钟会定期检查是否有要执行的任务,如果有,则会自动执行该任务
可以通过以下命令操作相关服务:
service crond status // 查看运行状态
service crond start // 启动服务
service crond stop // 关闭服务
service crond restart // 重启服务
service crond reload // 重新载入配置
使用 crontab 的优缺点: