注意:提前安装lsof命令
在控制台上输入:root@xx# yum install lsof
新建一个 a.sh文件
启动: ./a.sh start
关闭: ./a.sh stop
重启: ./a.sh restart
a.sh文件中的脚步:
#!/bin/sh
##注意:提前安装lsof命令
##在控制台上输入:root@xx# yum install lsof
##定义参数指定jar包位置
export relations_analysis=relations-analysis.jar
export space=space.jar
##定义对应的端口
export relations_analysis_port=8104
export space_port=8103
##接收参数 启动执行:./a.sh start 停止执行 ./a.sh stop
case "$1" in
##同时启动多个springBoot的jar包
start)
## 启动第一个jar包
echo "--------relations-analysis start--------------"
nohup java -jar $relations_analysis>./relations_analysis.log &
relations_analysis_pid=`lsof -i:$relations_analysis_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$relations_analysis_pid" ]
do
relations_analysis_pid=`lsof -i:$relations_analysis_port|grep "LISTEN"|awk '{print $2}'`
done
echo "--------relations_analysis_pid start success--------------"
## 启动第二个jar包
echo "--------relations-analysis start--------------"
nohup java -jar $space>./space.log &
space_pid=`lsof -i:$space_port|grep "LISTEN"|awk '{print $2}'`
until [ -n "$space_pid" ]
do
space_pid=`lsof -i:$space_port|grep "LISTEN"|awk '{print $2}'`
done
echo "--------space_pid start success--------------"
##最后加上两个引号
;;
##同时停止多个springBoot的jar包
stop)
P_ID=`ps -ef | grep -w $relations_analysis | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===relations_analysis process not exists or stop Failure"
else
kill -9 $P_ID
echo "relations_analysis stop success"
fi
P_ID=`ps -ef | grep -w $space | grep -v "grep" | awk '{print $2}'`
if [ "$P_ID" == "" ]; then
echo "===space process not exists or stop Failure"
else
kill -9 $P_ID
echo "space stop success"
fi
##最后加上两个引号
;;
restart)
$0 stop
sleep 2
$0 start
echo "===restart all success==="
##最后加上两个引号
;;
esac
exit 0
另一种写法简易版:
启动 ./a.sh 就行
#!/bin/sh
export relations_analysis=relations-analysis.jar
export space=space.jar
start1(){
echo "--------relations-analysis start--------------"
nohup java -jar $relations_analysis>./relations_analysis.log &
echo "--------relations_analysis_pid start success--------------"
echo "--------relations-analysis start--------------"
nohup java -jar $space>./space.log &
echo "--------space_pid start success--------------"
}
start1
==============================
docker中使用sell脚本部署
a.sh脚本
#!/bin/sh
java -jar /opt/relations-analysis.jar
DockerFile
FROM java:8
MAINTAINER tiger <tiger@gmail.com>
COPY ./a.sh /home/
RUN chmod 777 /home/a.sh && \
cd /opt/ && \
# 测试java环境
echo 'public class Main { public static void main(String[] args) { System.out.println("测试java环境===Java code is running fine!"); } }' > Main.java && \
javac Main.java && \
java Main
ENTRYPOINT ["/home/a.sh"]
EXPOSE 8104
执行命令:
构建镜像
docker build -t 镜像名称 -f /Dockerfiler .
构建容器运行:
docker run -id --name=i2 -p 8104:8104 -p 8103:8103 -v /app_file/jar/:/home/jiuddata/backend_app/ i2
/app_file/jar/:目录是宿主机的目录地址
/home/ :是容器中放jar包和sell的a.sh脚本的地址
只需要把jar放入宿主机的目录,启动容器即可
docker start 容器名称
========================
docker一个容器部署多个jar包
Dockerfile文件
FROM java:8
MAINTAINER tiger <tiger@gmail.com>
COPY ./a.sh /home/
RUN chmod 777 /home/a.sh && \
cd /opt/ && \
# 测试java环境
echo 'public class Main { public static void main(String[] args) { System.out.println("测试java环境===Java code is running fine!"); } }' > Main.java && \
javac Main.java && \
java Main
ENTRYPOINT ["/home/a.sh"]
##我的这个EXPOSE可写可不写,没啥用
EXPOSE 8104
a.sh的sell脚步
#!/bin/sh
nohup java -jar /home/relations-analysis.jar &
nohup java -jar /home/space.jar &
##在脚本最后一行添加tail -f /dev/null,这个命令永远完成不了,所以该脚本一直不会执行完,所以该容器永远不会退出
tail -f /dev/null
构建镜像:
docker build -t i2 .
构建容器:
docker run -id --name=i2 -p 8104:8104 -p 8103:8103 -v /app_file/jar/iss/:/home/ i2
解释:
其实主要用到的是docker的目录和宿主机的目录映射操作/home/容器内部的目录和宿主机存放jar包目录映射,就和最上面那种直接启动多个jar包类似的操作
下面是避免jar包异常--自动重启jar操作的a.sh脚本:
开头是:#!/bin/sh可能会出现异常"[[ : not found"
#! /bin/sh指定运行该脚本所使用的shell类型,这里使用sh来解释语句,那么试试更换成bash来执行,将执行语句换成 #!/bin/bash
#!/bin/bash
start1(){
echo "starting relations-analysis....."
nohup java -jar /home/relations-analysis.jar &
}
start2(){
echo "starting space....."
nohup java -jar /home/space.jar &
}
#定义一个方法pid_health_check $1是这个方法的参数,其他地方调用此方法传入进来
pid_health_check(){
#定义一个linux的命令字符串 $1是这个方法的参数类似于(ps -ef|grep tomcat 的命令),其他地方调用此方法传入进来
#这个命令解释: 搜索linux中的进程 并且过滤掉-带grep的那条
process_cnt=`ps -ef | grep $1 | grep -v grep | wc -l`
#表示执行上面定义的process_cnt命令
echo $process_cnt
#返回值-上面命令查询出来的日志的条数
return $?
}
##在脚本最后一行添加tail -f /dev/null,这个命令永远完成不了,所以该脚本一直不会执行完,所以该容器永远不会退出
##tail -f /dev/null
##我这里写的死循环就不用上面的那个查看日志的命令了
start1
start2
while [[ 1 -gt 0 ]]
do
echo "check healthy of tomcat...."
process_cnt=$(pid_health_check relations-analysis)
##if语句 (ps -ef|grep relations-analysis)查询结果小于1表示此服务已经停了
if [[ $process_cnt -lt 1 ]]
then
start1
fi
echo "check healthy of wiki-backend...."
process_cnt=$(pid_health_check space)
if [[ $process_cnt -lt 1 ]]
then
start2
fi
##睡眠1
sleep 1m
done