前面的博客中,笔者说了,如何在shell脚本中执行maven生成的可执行jar,博客地址:maven 生成可执行jar并使用shell脚本运行
下面,笔者说下,如何使用Linux 中的Crontab来定时执行shell脚本,也是工作中实际遇到需要定时执行shell脚本,在这做个记录,以后可以方便查看,如果你也遇到类似的,可以做个参考。
打开上面的博客链接,可以看到有个HelloWorld.java类,修改类代码,如下
public class HelloWorld {
public static void main(String[] args) throws Exception {
String execDate= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
System.out.print("start execute..." + execDate);
Thread.sleep(3000); // 模拟程序执行时间
System.out.println("Hello World");
System.out.println("execute finish...");
}
}
然后使用maven生成可执行jar,具体请参考上述提到的博客链接,编写shell脚本如下
#!/bin/bash
# FileName:helloworld.sh
# Author:harvey
start_time=`date +%s`
export JAVA_HOME=/usr/local/java
export PATH=$JAVA_HOME/bin:$PATH
java -Xms512m -Xmx1024m -jar /root/data/jar/helloworld-jar-with-dependencies.jar
end_time=`date +%s`
elapse_time=$((${end_time}-${start_time}))
echo -e "\n exec jar takes ${elapse_time} seconds\n"
注意:shell脚本文件中要设置下java的环境变量,否则使用crontab定时执行脚本时回不起作用。
赋予shell脚本可执行权限
chmod +x helloworld.sh
使用crontab前,我们先来看下它如何使用,类似于spring 中的quartz
* | * | * | * | * | command |
---|---|---|---|---|---|
minute | hour | day | month | week | command |
分 | 时 | 天 | 月 | 星期 | command |
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”。
中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。
crontab 范例
每五分钟执行 /5 * * *
每小时执行 0 * * * *
每天执行 0 0 * * *
每周执行 0 0 * * 0
每月执行 0 0 1 * *
每年执行 0 0 1 1 *
输入如下命令,设置crontab定时执行shell脚本
crontab -e
输入字母i,进入插入模式,编写如下内容(一分钟执行一次),然后保存退出
*/1 * * * * /root/data/shellfile/helloworld.sh >> /root/data/log/helloworld.log
编辑完成后可以使用如下命令,来查看linux所有的中crontab定时任务
crontab -l
运行结果:
start execute...2018-01-24 13:53:01
Hello World
execute finish...
exec jar takes 3 seconds
start execute...2018-01-24 13:54:01
Hello World
execute finish...
exec jar takes 3 seconds
start execute...2018-01-24 13:55:01
Hello World
execute finish...
exec jar takes 3 seconds