linux的sell脚本同时启动多个SpringBoot的jar和docker一个容器部署多个SpringBoot的jar包

注意:提前安装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 
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 
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

 

 

你可能感兴趣的:(linux,docker)