Linux -- 将SpringBoot项目做成Linux服务开机启动

  每次服务器断电或维护之后,需要手工去挨个启动所有服务,非常麻烦而且容易出错,所以想做将项目做成linux的服务,开机自动启动,这样既节省了时间,又不容易出错。

修改pom

  1. 加入springboot的打包插件,这样打成的jar包可以直接执行。或者不使用这个插件,使用打依赖包并且把lib包单独打出来的也是可以的,无所谓,主要是启动脚本的编写。
<build>
    <plugins>
         <plugin>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-maven-plugin</artifactId>
             <configuration>
                 <executable>true</executable>
             </configuration>
         </plugin>
     </plugins>
 </build>
  1. 将服务打成jar包和war包,并传到服务器
    在这里插入图片描述
    在这里插入图片描述
  2. 将service、web分别放入需要的文件夹,jar包就是单独放一个文件夹,war包就是放入tomcat的webapp下
    在这里插入图片描述
  3. 我们公司会为service写启动脚本(或者写一个统一的启动脚本都行,我这里就按自己的方式来了)
    在这里插入图片描述
#编写一个新文件
vi start.sh
#在start.sh中写启动命令
#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
nohup java -Dspring.config.location=/root/dz-facesign/app-service/service-conf/ -jar /root/dz-facesign/app-service/app-service-1.0-SNAPSHOT.jar  >> /root/dz-facesign/app-service/app-service.log  2>&1 &
  1. 我们这里就是很简单的一个启动命令,指定外部配置文件,指定运行的jar和日志输出的位置。这里有个坑就是一定要在上面加上环境变量,不然启动会报错的:failed to run command ‘java’: No such file or directory,切记切记
  2. 为当前这个启动脚本增加可执行权限
chmod u+x start.sh
  1. 为每个servcie编写这个脚本,为每个web所属的tomcat的bin/catalina.sh中也加入环境变量,不然Tomcat启动也是找不到jdk的,也是切记切记。
vi catalina.sh 
export JAVA_HOME=/opt/jdk1.8.0_181
export PATH=$JAVA_HOME/bin:$PATH
  1. 为所有的依赖组件添加环境变量,我们这里就用到了zookeeper,所以只在zkServer.sh开头增加了这两个配置,切记切记。
  2. 编写总的启动脚本,调动所有的服务启动,当然,在最开始启动时最好先把存在的服务关闭掉,避免端口冲突,启动失败。
#编写一个总关闭脚本
vi shutdown-facesign.sh

#在总脚本中写
#!/bin/bash

zookeeper_pid=`ps -ef |grep QuorumPeerMain |grep -v grep |awk '{print $2}'`
#echo "zookeeper_pid = $zookeeper_pid"  >> /root/dz-facesign/start.log

pre_app_servcie_pid=`ps -ef |grep app-service-1.0-SNAPSHOT.jar |grep -v grep |awk '{print $2}'`
#echo "pre_app_servcie_pid = $pre_app_servcie_pid"      >> /root/dz-facesign/start.log

pre_app_web_pid=`ps -ef |grep app-web |grep -v grep |awk '{print $2}'`
#echo "pre_app_web_pid = $pre_app_web_pid"      >> /root/dz-facesign/start.log

pre_manager_service_pid=`ps -ef |grep manager-service-1.0-SNAPSHOT.jar |grep -v grep |awk '{print $2}'`
#echo "pre_manager_service_pid = $pre_manager_service_pid"      >> /root/dz-facesign/start.log

pre_manager_web_pid=`ps -ef |grep manager-web |grep -v grep |awk '{print $2}'`
#echo "pre_manager_web_pid = $pre_manager_web_pid"      >> /root/dz-facesign/start.log

#定义方法,关闭服务
shutdown() {
        #关闭zookeeper
        if [ "$zookeeper_pid" != "" ]
        then    
                kill -9 $zookeeper_pid
        echo "zookeeper shutdown ......"        >> /root/dz-facesign/start.log
        fi

        #关闭app-service
        if [ "$pre_app_servcie_pid" != "" ]
        then    
                kill -9 $pre_app_servcie_pid
        echo "app-service shutdown ......"      >> /root/dz-facesign/start.log
        fi

        #关闭app-web
        if [ "$pre_app_web_pid" != "" ]
        then    
                kill -9 $pre_app_web_pid
        echo "app-web shutdown ......"  >> /root/dz-facesign/start.log
        fi

        #关闭manager-service
        if [ "$pre_manager_service_pid" != "" ]
        then    
                kill -9 $pre_manager_service_pid
        echo "manager-service shutdown ......"  >> /root/dz-facesign/start.log
        fi

        #关闭manager-web
        if [ "$pre_manager_web_pid" != "" ]
        then    
                kill -9 $pre_manager_web_pid
        echo "manager-web shutdown ......"      >> /root/dz-facesign/start.log
        fi
}
#调用方法,关闭服务
shutdown
  1. 我们这里关闭了1个zookeeper服务,2个servcie服务,2个web服务,因为我不是运维所以shell脚本很烂,只能简单写写,有高手指导欢迎留言。
  2. 编写总启动脚本,脚本中先是调用了总关闭脚本关闭所有服务,再是挨个启动其他服务
#编写一个总启动脚本
vi start-facesign.sh

#在总脚本中写
#!/bin/bash
# chkconfig: 2345 10 90 
# description: facesign

#一定要有上面这三句
#关闭已启动的服务
sh /root/shutdown-facesign.sh

#休眠1秒
sleep 1s

#启动app-service服务
echo "" >> /root/dz-facesign/start.log
cd /opt/zookeeper
sh /opt/zookeeper/bin/zkServer.sh start
echo "zookeeper is wait for running ......" >> /root/dz-facesign/start.log

#休眠5秒
sleep 5s

zookeeper_pid=`ps -ef |grep QuorumPeerMain |grep -v grep |awk '{print $2}'`
if [ "$zookeeper_pid" != "" ]
        then
                echo "zookeeper startup success !"
fi

#启动app-service服务
echo "" >> /root/dz-facesign/start.log
cd /root/dz-facesign/app-service
sh /root/dz-facesign/app-service/start.sh
echo "app-service is wait for running ......" >> /root/dz-facesign/start.log

#启动manager-servcie服务
echo "" >> /root/dz-facesign/start.log
cd /root/dz-facesign/manager-service
sh /root/dz-facesign/manager-service/start.sh
echo "manager-service is wait for running ......" >> /root/dz-facesign/start.log

#休眠30秒,让service服务完全启动
sleep 30s

app_service_pid=`ps -ef |grep app-service |grep -v grep |awk '{print $2}'`
#echo "app_service_pid = $app_service_pid"      >> /root/dz-facesign/start.log

manager_service_pid=`ps -ef |grep manager-service |grep -v grep |awk '{print $2}'`
#echo "manager_service_pid = $manager_service_pid"      >> /root/dz-facesign/start.log

#定义方法,启动web
service(){
        if [ "$app_service_pid" != "" ]
        then    
                #app-service启动完成后启动app-web
                echo "app-service startup success !"    >> /root/dz-facesign/start.log
                sh /root/dz-facesign/app-web/bin/startup.sh
                echo "app-web is wait for running ......"       >> /root/dz-facesign/start.log
        fi

        #输出空行
        echo "" >> /root/dz-facesign/start.log

        if [ "$manager_service_pid" != "" ]
        then
                #manager-service启动完成后启动manager-web
                echo "manager-service startup success !"        >> /root/dz-facesign/start.log
                sh /root/dz-facesign/manager-web/bin/startup.sh
                echo "manager-web is wait for running ......"   >> /root/dz-facesign/start.log
        fi
}

#调用方法,启动web
service
  1. 为这两个脚本增加可执行权限
chmod u+x shutdown-facesign.sh
chmod u+x start-facesign.sh
  1. 这样算是所有服务配置完了,单独运行这个启动脚本,所有服务就可以启动了,但这还没有完,我们还需要将这个总的启动脚本配置到Linux服务中,这个很简单只需要软连接到/etc/init.d/目录下就好了,这里也是要注意,一定要是绝对路径!!!
# 那个init.d/facesign的facesign就是服务名称
ln -s /root/start-facesign.sh /etc/init.d/facesign
  1. 这个时候就已经可以使用service命令来启动所有服务了
    在这里插入图片描述
    在这里插入图片描述
  2. 还有最后一步就是配置开机启动,这个也是很容易的,配置一下就可以了,但是这样还是会有一个问题就是:service XXX does not support chkconfig,这个需要在启动脚本中添加两个配置就可以了。
chkconfig --add facesign
vi /etc/init.d/facesign
#在第一行,也就是#!/bin/bash下面加入这两行就可以了
# chkconfig: 2345 10 90 
# description: myservice ....

在这里插入图片描述

  1. 接下来就可以重启验证了。

可能的坑

  1. 最最重要的就是为真正的启动脚本配置环境变量
  2. 所有的执行路径都需要是绝对路径
  3. 为每个sh脚本增加可执行权限
  4. 防火墙啥的就不说了

结语

  其实文章写的看似很多,实际上面配置自己服务启动的东西都是本来就有的,其实就增加了一个总的启动脚本、关闭脚本,和软连接到linux服务以及设置开机启动,其实还是比较容易的,这样通过几部操作,就省去了大量的时间,降低了大量的错误率,还是值得一试的。

发布了66 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Aeve_imp/article/details/100728193
今日推荐