详解spring boot 以jar的方式启动常用shell脚本
时间:2019-04-06
本文章向大家介绍详解spring boot 以jar的方式启动常用shell脚本,主要包括详解spring boot 以jar的方式启动常用shell脚本使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
用spring boot框架做的项目,将第三方包全部打在jar里面,通过shell脚本启动和停止服务,常用的shell脚本模板如下:
#!/bin/bash JAVA_OPTIONS_INITIAL=-Xms128M JAVA_OPTIONS_MAX=-Xmx512M _JAR_KEYWORDS=monitor-alarm-task-1.0-SNAPSHOT.jar APP_NAME=monitor-alarm-task APPLICATION_FILE=/opt/scpip_monitor/application.properties PID=$(ps aux | grep ${_JAR_KEYWORDS} | grep -v grep | awk '{print $2}' ) ALARM_CONFIG_FILE=`pwd`/alarmConfig.yaml function check_if_process_is_running { if [ "$PID" = "" ]; then return 1 fi ps -p $PID | grep "java" return $? } case "$1" in status) if check_if_process_is_running then echo -e "\033[32m $APP_NAME is running \033[0m" else echo -e "\033[32m $APP_NAME not running \033[0m" fi ;; stop) if ! check_if_process_is_running then echo -e "\033[32m $APP_NAME already stopped \033[0m" exit 0 fi kill -9 $PID echo -e "\033[32m Waiting for process to stop \033[0m" NOT_KILLED=1 for i in {1..20}; do if check_if_process_is_running then echo -ne "\033[32m . \033[0m" sleep 1 else NOT_KILLED=0 fi done echo if [ $NOT_KILLED = 1 ] then echo -e "\033[32m Cannot kill process \033[0m" exit 1 fi echo -e "\033[32m $APP_NAME already stopped \033[0m" ;; start) if [ "$PID" != "" ] && check_if_process_is_running then echo -e "\033[32m $APP_NAME already running \033[0m" exit 1 fi nohup java -jar -Dalarm.config.file=$ALARM_CONFIG_FILE $JAVA_OPTIONS_INITIAL $JAVA_OPTIONS_MAX $_JAR_KEYWORDS --spring.config.location=$APPLICATION_FILE > /dev/null 2>&1 & echo -ne "\033[32m Starting \033[0m" for i in {1..20}; do echo -ne "\033[32m.\033[0m" sleep 1 done if check_if_process_is_running then echo -e "\033[32m $APP_NAME fail \033[0m" else echo -e "\033[32m $APP_NAME started \033[0m" fi ;; restart) $0 stop if [ $? = 1 ] then exit 1 fi $0 start ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
正真启动的命令:
复制代码 代码如下:
nohup java -jar -Dalarm.config.file=$ALARM_CONFIG_FILE $JAVA_OPTIONS_INITIAL $JAVA_OPTIONS_MAX $_JAR_KEYWORDS --spring.config.location=$APPLICATION_FILE > /dev/null 2>&1 &
其中-Dalarm.config.file 指定了外部配置文件的路径,在service初始化中通过这个路径读取外部配置文件,然后解析成对象,如下:
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Service; import org.yaml.snakeyaml.Yaml; import scpip.monitor.task.obj.MetricObj; @Service public class AlarmConfigService { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private Map<String,MetricObj> metricMap; public AlarmConfigService (){ metricMap = new HashMap<String,MetricObj>(); init(); } private void init(){ BufferedReader buffer; try { InputStream cpResource = new FileInputStream(getAlarmConfigFile()); buffer = new BufferedReader(new InputStreamReader(cpResource,"utf-8")); Yaml yaml = new Yaml(); //Map<String, List<Map<String,String>>> object = (Map<String, List<Map<String,String>>>) yaml.load(getAlarmConfigFile()); Map<String, List<Map<String,String>>> object = (Map<String, List<Map<String,String>>>) yaml.load(buffer); logger.info("object==" + object); parseConfigMap(object); } catch (Exception e) { e.printStackTrace(); } } public Map<String, MetricObj> getMetricMap() { return metricMap; } //{metricName=当前响应时间, alarmValue=10,20,40, columnName=response_time}, private void parseConfigMap(Map<String,List<Map<String,String>>> object){ MetricObj obj = null; for (String key : object.keySet()) { List<Map<String,String>> values = object.get(key); for(Map<String,String> map : values){ obj = new MetricObj(); String metricName = map.get("metricName"); obj.setAlarmValue(map.get("alarmValue")); obj.setColumnName(map.get("columnName")); obj.setTableName(map.get("tableName")); obj.setMetricName(metricName); metricMap.put(metricName,obj); } } } private static String getAlarmConfigFile() { return System.getProperty("alarm.config.file"); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
- Web 前端利器Emmet 的CSS 用法总结
- 响应式 HTML 邮件制作之三个实例
- java知识点归纳
- EaseMobile 主题导航菜单设置小图标的方法(图文+视频教程)
- NEC css规范
- DW Mobile Switcher:移动设备识别切换主题插件
- 揭秘技术大国以色列
- mix-blend-mode 混合模式 background-blend-mode 背景混合模式 isolation:isolate 隔离
- wp_nav_menu 函数经Walker_Nav_Menu 类自定义导航菜单HTML
- css3 RGBA 红色R+绿色G+蓝色B+Alpha通道
- css3 gradient 渐变
- TwentyTwenty:一个图片特效Jquery 插件
- 何为实在
- css3 动画应用 animations 和transtions transform在加上JavaScript 可以实现硬件加速动画。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 关于Python的前后、单双下划线作用,看完这篇文章,吊打面试官!
- 图解EfficientNet模型的完整细节
- (⊙o⊙)?markdown文档中插入萌萌的emoji表情
- C语言中的字符串可以怎么处理?
- 一个简单的C语言测试框架
- Let's Encrypt实践指北
- MassTransit Get Started->
- 一次性把所有普通和经典的网页布局讲得通通透透的,多图预警,建议收藏
- Github标星 8K+,免费又好用的Redis客户端工具!
- Python判断字符串是否包含特定子串的7种方法
- 用后台开发的逻辑理念学习VUE
- 进程管理-Linux每日一练(6)
- AkShare-能源数据-碳排放-国际行情
- Linux 【Shell脚本经典案例】
- 【Vulnhub】SecTalks: BNE0x00 - Minotaur