每次服务器断电或维护之后,需要手工去挨个启动所有服务,非常麻烦而且容易出错,所以想做将项目做成linux的服务,开机自动启动,这样既节省了时间,又不容易出错。
修改pom
- 加入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>
- 将服务打成jar包和war包,并传到服务器
- 将service、web分别放入需要的文件夹,jar包就是单独放一个文件夹,war包就是放入tomcat的webapp下
- 我们公司会为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 &
- 我们这里就是很简单的一个启动命令,指定外部配置文件,指定运行的jar和日志输出的位置。这里有个坑就是一定要在上面加上环境变量,不然启动会报错的:failed to run command ‘java’: No such file or directory,切记切记
- 为当前这个启动脚本增加可执行权限
chmod u+x start.sh
- 为每个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
- 为所有的依赖组件添加环境变量,我们这里就用到了zookeeper,所以只在zkServer.sh开头增加了这两个配置,切记切记。
- 编写总的启动脚本,调动所有的服务启动,当然,在最开始启动时最好先把存在的服务关闭掉,避免端口冲突,启动失败。
#编写一个总关闭脚本
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个zookeeper服务,2个servcie服务,2个web服务,因为我不是运维所以shell脚本很烂,只能简单写写,有高手指导欢迎留言。
- 编写总启动脚本,脚本中先是调用了总关闭脚本关闭所有服务,再是挨个启动其他服务
#编写一个总启动脚本
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
- 为这两个脚本增加可执行权限
chmod u+x shutdown-facesign.sh
chmod u+x start-facesign.sh
- 这样算是所有服务配置完了,单独运行这个启动脚本,所有服务就可以启动了,但这还没有完,我们还需要将这个总的启动脚本配置到Linux服务中,这个很简单只需要软连接到/etc/init.d/目录下就好了,这里也是要注意,一定要是绝对路径!!!
# 那个init.d/facesign的facesign就是服务名称
ln -s /root/start-facesign.sh /etc/init.d/facesign
- 这个时候就已经可以使用service命令来启动所有服务了
- 还有最后一步就是配置开机启动,这个也是很容易的,配置一下就可以了,但是这样还是会有一个问题就是:service XXX does not support chkconfig,这个需要在启动脚本中添加两个配置就可以了。
chkconfig --add facesign
vi /etc/init.d/facesign
#在第一行,也就是#!/bin/bash下面加入这两行就可以了
# chkconfig: 2345 10 90
# description: myservice ....
- 接下来就可以重启验证了。
可能的坑
- 最最重要的就是为真正的启动脚本配置环境变量
- 所有的执行路径都需要是绝对路径
- 为每个sh脚本增加可执行权限
- 防火墙啥的就不说了
结语
其实文章写的看似很多,实际上面配置自己服务启动的东西都是本来就有的,其实就增加了一个总的启动脚本、关闭脚本,和软连接到linux服务以及设置开机启动,其实还是比较容易的,这样通过几部操作,就省去了大量的时间,降低了大量的错误率,还是值得一试的。