1、如何精确找到jar应用进程
shell
# 以 dist-app-manage.jar 为例
[root@localhost dist-app-manage-8083]# ps -ef|grep dist-app-manage.jar
root 5134 5033 0 21:24 pts/0 00:00:00 grep --color=auto dist-app-manage.jar
root 21766 1 1 Sep02 ? 03:16:25 java -jar dist-app-manage.jar --server.port=8083
root 34853 1 1 Sep11 ? 00:48:09 java -jar /opt/huaian/application/report-manager-8070/dist-app-manage.jar --server.port=8070
[root@localhost dist-app-manage-8083]#
# 以上可以看出如果是集群环境,我们只是使用jar文件名来查找进程的话,会查出来多个
# 所以我们加上命令行参数就能精确定位某个jar进程,例如
#!/bin/bash
path=/opt/huaian/application/report-manager-8070/dist-app-manage.jar
pid=$(ps aux | grep 'java -jar '$path' --server.port=8070' | awk '{print $2}')
echo "debug $pid"
2、编辑启动脚本
我们要实现的功能也很简单,就是精确找到jar
应用的进程ID,判断是否有进程ID,如果有进程ID就杀死进程,否则直接启动即可。详见以下脚本:
vi start.sh
shell
#!/bin/bash
# java -Xmx8g -Xms4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -jar dist-app-cvt.jar --server.port=8088 --spring.datasource.url=jdbc:h2:./dist-app-cvt --cvt.cache-path=./dist-cvt
JAR_PATH=/home/application/dist-cvt-8088/dist-app-cvt.jar
APP_LOG_PATH=/home/application/dist-cvt-8088/app.log
pid=$(ps aux | grep 'java -Xmx8g -Xms4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -jar '$JAR_PATH' --server.port=8088 --spring.datasource.url=jdbc:h2:./dist-app-cvt --cvt.cache-path=./dist-cvt' | awk '{print $2}')
if [ -n "$pid" ]; then
# kill process
echo "===> [$JAR_PATH] pid = $pid"
kill -9 $pid
sleep 5
fi
# 删除日志文件
rm -rf $APP_LOG_PATH
# 导出outsidein环境变量
source /etc/profile.d/ev.sh
nohup java -Xmx8g -Xms4g -Xmn2g -XX:MetaspaceSize=256m \
-XX:MaxMetaspaceSize=512m \
-XX:+UseParallelGC \
-XX:+UseParallelOldGC \
-jar $JAR_PATH \
--server.port=8088 \
--spring.datasource.url=jdbc:h2:./dist-app-cvt \
--cvt.cache-path=./dist-cvt \
>> $APP_LOG_PATH 2>&1 &
new_pid=$(ps aux | grep 'java -Xmx8g -Xms4g -Xmn2g -XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -jar '$JAR_PATH' --server.port=8088 --spring.datasource.url=jdbc:h2:./dist-app-cvt --cvt.cache-path=./dist-cvt' | awk '{print $2}')
if [ -n "$new_pid" ]; then
# new process id
echo "===> start success new pid = $new_pid"
else
echo "===> start error not found [ $JAR_PATH ] start process"
fi
3、设置定时任务
shell
# 查看当前系统定时任务
crontab -l
# 编辑定时任务
crontab -e
0 6 * * * /home/application/dist-cvt-8088/start.sh
# 0 分
# 6 时(6代表凌晨两点整)
# * 天
# * 月
# * 年