前言:打包好的springboot项目,可以使用java -jar xxx.jar的方式启动。当出现多个springboot项目需要启动的时候,可以使用脚本启动的方式。这在springcloud项目的开发测试阶段尤为有用。以下展示启动脚本示例,过程中遇到的问题,以及相关的解决办法。
1、启动脚本
#!/bin/sh
export EUREKA=ruoyi-eureka-1.0.2-SNAPSHOT.jar
export CONFIG=ruoyi-config-1.0.2-SNAPSHOT.jar
export AUTH=ruoyi-auth-1.0.2-SNAPSHOT.jar
export SYS=ruoyi-system-1.0.2-SNAPSHOT.jar
export ACTIVITI=ruoyi-activiti-1.0.2-SNAPSHOT.jar
export EUREKA_port=9001
export CONFIG_port=9002
export AUTH_port=9004
export SYS_port=9005
export ACTIVITI_port=9006
case "$1" in
start)
## 启动eureka
echo "--------eureka 开始启动--------------"
nohup java -jar $EUREKA > log-eureka.file 2>&1 &
EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$EUREKA_pid" ]
do
EUREKA_pid=`lsof -i:$EUREKA_port|grep "LISTEN"|awk '{print $2}'`
done
echo "EUREKA pid is $EUREKA_pid"
echo "--------eureka 启动成功--------------"
## 启动config
echo "--------开始启动CONFIG---------------"
nohup java -jar $CONFIG > log-config.file 2>&1 &
CONFIG_pid=`lsof -i:$CONFIG_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$CONFIG_pid" ]
do
CONFIG_pid=`lsof -i:$CONFIG_port|grep "LISTEN"|awk '{print $2}'`
done
echo "CONFIG pid is $CONFIG_pid"
echo "---------CONFIG 启动成功-----------"
## 启动auth
echo "--------开始启动AUTH---------------"
nohup java -jar $AUTH > log-auth.file 2>&1 &
AUTH_pid=`lsof -i:$AUTH_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$AUTH_pid" ]
do
AUTH_pid=`lsof -i:$AUTH_port|grep "LISTEN"|awk '{print $2}'`
done
echo "AUTH pid is $AUTH_pid"
echo "---------AUTH 启动成功-----------"
## 启动system
echo "--------开始启动system---------------"
nohup java -jar $SYS > log-sys.file 2>&1 &
SYS_pid=`lsof -i:$SYS_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$SYS_pid" ]
do
SYS_pid=`lsof -i:$SYS_port|grep "LISTEN"|awk '{print $2}'`
done
echo "SYS pid is $SYS_pid"
echo "---------system 启动成功-----------"
## 启动ACTIVITI
echo "--------开始启动启动ACTIVITI---------------"
nohup java -jar $ACTIVITI > log-act.file 2>&1 &
ACTIVITI_pid=`lsof -i:$ACTIVITI_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$ACTIVITI_pid" ]
do
ACTIVITI_pid=`lsof -i:$ACTIVITI_port|grep "LISTEN"|awk '{print $2}'`
done
echo "ACTIVITI pid is $ACTIVITI_pid"
echo "---------启动ACTIVITI启动成功-----------"
echo "===全部启动成功==="
;;
stop)
P_ID=`ps -ef | grep -w $EUREKA | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===EUREKA process not exists or stop success"
else
kill -9 $P_ID
echo "EUREKA killed success"
fi
P_ID=`ps -ef | grep -w $CONFIG | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===CONFIG process not exists or stop success"
else
kill -9 $P_ID
echo "CONFIG killed success"
fi
P_ID=`ps -ef | grep -w $AUTH | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===AUTH process not exists or stop success"
else
kill -9 $P_ID
echo "AUTH killed success"
fi
P_ID=`ps -ef | grep -w $SYS | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===SYS process not exists or stop success"
else
kill -9 $P_ID
echo "SYS killed success"
fi
P_ID=`ps -ef | grep -w $ACTIVITI | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===ACTIVITI process not exists or stop success"
else
kill -9 $P_ID
echo "ACTIVITI killed success"
fi
echo "===stop success==="
;;
restart)
$0 stop
sleep 2
$0 start
echo "===restart success==="
;;
esac
exit 0
假设上述启动脚本所在目录为:/usr/local/deploy,脚本名称为start-ruoyi.sh,启动命令为:(停止和重启命令类似)
cd /usr/local/deploy
sh start-ruoyi.sh start
2、遇到的问题
1)脚本运行错误:centos 运行shell 出现未预期的符号 `$’ \r’ ’ 附近有语法错误,未预期的文件结尾等
看上去是语法错误,或者换行符之类的问题,但实际原因是自己的文件是从windows里面拷贝到centos的,两种系统格式不一样。
解决方法如下:
(1)打开notepad++编辑.sh文件
(2)notepad++右下角将windows模式改为linux模式
2)指定端口被占用:centos关闭占用某个端口的应用程序
以关闭占用8080端口的应用程序为例
先输入netstat -lnp|grep 8080 找到该应用程序 编号 28937
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 28937/java
然后执行kill杀死该应用程序
kill -9 28937
3)在微服务启动过程中,上述shell文件,在微服务auth启动会出现报错:spring cloud config server—No instances found of configserver,原因是auth没有读取到spring cloud config服务的配置信息(原因可能是即便config server启动成功了,auth微服务也不能及时通过注册中心拿到配置)。关于该问题有经验的伙伴可以指导下。
解决办法:
(1) 分为2个shell,注册中心和配置中心一般不会频繁启停,单独写一个shell。其他业务类型的微服务写一个shell。
(2) 猜想也可以在auth微服务前设置一定等待时间,但未验证。
文章参考:
centos关闭占用某个端口的应用程序:https://blog.csdn.net/weixin_38992765/article/details/91979934
centos 运行脚本错误 centos 运行shell 出现未预期的符号 `$‘do\r’’ 附近有语法错误:
https://blog.csdn.net/lkwan123/article/details/79648852
springboot项目脚本启动命令:
https://segmentfault.com/a/1190000012030747