前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实现一个启动多个jar或多个服务的脚本

实现一个启动多个jar或多个服务的脚本

作者头像
路行的亚洲
发布2021-08-20 15:05:19
4.2K0
发布2021-08-20 15:05:19
举报
文章被收录于专栏:后端技术学习

如果出现linux中的服务宕机时,需要将一个一个的脚本启动起来,比较麻烦。那有什么办法可以一键启动多个脚本呢?

答案当然是有的。

在一开始,我选择了参考网上所说的定义一个rc.local文件,修改/etc/rc.local,但发现这种方法可以实现自启动脚本,但是通常只能启动一个服务,然后后面的服务就不能启动了。这个是因为自己做了实验发现的。

还有一个问题就是有一些参考脚本里面的开头是#!/bin/sh -e,这样使得脚本不能启动,这个-e需要去掉。

接着我又准备尝试使用他们所说的一些自启动脚本,但是发现文章所写的,多少会有点错误,就是启动的时候,要进行权限的修改,同时在启动自启动脚本时,需要对需要启动的脚本的位置使用绝对路径,而不是相对路径,因为如果使用相对路径就会报一个错误:

代码语言:javascript
复制
Error: Unable to access jarfile 运行jar包报错

在网上查找资料,你会发现出现这个问题的原因只有两个

代码语言:javascript
复制
一个是写的jar包的路径一定需要是绝对路径
二就是你的安装的JDK与jar包中的JDK不是同一版本

因此发现问题就是路径的问题。

修改成绝对路径之后,问题还是没有得到解决。如果使用rc.local的脚本,我发现网上都是教你如何启动,但是没有教如何关闭、重启。而且处理不够优雅,比较粗暴,同时没有将启动的日志信息进行记录,不能很好的确认服务是否启动。

但是之后发现一篇文章写得还是比较人性化的,处理脚本的命令是比较可靠,同时处理服务启动是比较温和的。按照这篇文章的方式

Linux shell脚本,按顺序批量启动多个jar包,批量启动spring cloud的jar包

我在本地自己的虚拟机成功的启动了多个jar包,同时成功的部署了自己的jar包和war。当然这个脚本有一个问题就是jar包的位置应该写成绝对路径,否则的话,也会出现上面启动jar包启动不起来的错误。

这里贴上自己的命令,我使用的虚拟机是ubuntu18,因为公司使用的是阿里云的ubuntu:

代码语言:javascript
复制
#!/bin/sh
export GIGASSISTSVC=/usr/local/gig-assist-svc.jar
export GIGASSISTSVC_log=/usr/local/logs/gig.log

export DEMO=/usr/local/demo-0.0.1-SNAPSHOT.jar
export DEMO_log=/usr/local/logs/demo.log

export GIGASSISTSVC_port=9981
export DEMO_port=8080


case "$1" in

start)
        # 启动gig
        echo "--------gig 开始启动--------------"
        nohup java -jar $GIGASSISTSVC > $GIGASSISTSVC_log 2>&1 &
        GIGASSISTSVC_pid=`lsof -i:$GIGASSISTSVC_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$GIGASSISTSVC_pid" ]
            do
              GIGASSISTSVC_pid=`lsof -i:$GIGASSISTSVC_port|grep "LISTEN"|awk '{print $2}'`
            done
        echo "GIGASSISTSVC pid is $GIGASSISTSVC_pid"
        sleep 10
        echo "--------gig-assist-svc 启动成功--------------"

       # 启动demo
        echo "--------demo 开始启动--------------"
        nohup java -jar $DEMO > $DEMO_log 2>&1 &
        DEMO_pid=`lsof -i:$DEMO_port|grep "LISTEN"|awk '{print $2}'`
        until [ -n "$DEMO_pid" ]
            do
              DEMO_pid=`lsof -i:$DEMO_port|grep "LISTEN"|awk '{print $2}'`
            done
        echo "DEMO pid is $DEMO_pid"
        sleep 10
        echo "--------demo 启动成功--------------"

        echo "===startAll success==="
        ;;

 stop)
        P_ID=`ps -ef | grep -w $GIGASSISTSVC | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===GIGASSISTSVC process not exists or stop success"
        else
            kill -9 $P_ID
            echo "GIGASSISTSVC killed success"
        fi
 P_ID=`ps -ef | grep -w $DEMO | grep -v "grep" | awk '{print $2}'`
        if [ "$P_ID" == "" ]; then
            echo "===DEMO process not exists or stop success"
        else
            kill -9 $P_ID
            echo "DEMO killed success"
        fi
        echo "===stop success==="
        ;;

restart)
        $0 stop
        sleep 10
        $0 start
        echo "===restart success==="
        ;;
esac
exit 0

此时先可以本地进行测试启动上面的shell脚本。如果可以

第三步、设置开机启动

设置开机启动前,需要再编辑脚本,在前两行添加以下代码

代码语言:javascript
复制
#!/bin/sh
#chkconfig:2345 80 90
#description:auto_run
 
#用于开机后,快速同时启动指定服务的脚本

把文件移动到/etc/init.d的目录下

代码语言:javascript
复制
[root@root myScript]# mv service_init.sh /etc/init.d

使用chkconfig命令将脚本添加到开机启动

代码语言:javascript
复制
[root@root init.d]# chkconfig --add service_init.sh
[root@root init.d]# chkconfig service_init.sh on

但是如果是ubuntu的系统,遗憾的是,这两行命令是执行不过去的。

如果遇到没有chkconfig命令,则参考 https://blog.csdn.net/willingtolove/article/details/107494719 这篇文章解决没有chkconfig这个问题和https://blog.csdn.net/willingtolove/article/details/107496063这篇文章。

因此将命令修改成:chkconfig =>sysv-rc-conf

代码语言:javascript
复制
[root@root init.d]# sysv-rc-conf --add service_init.sh
[root@root init.d]# sysv-rc-conf service_init.sh on

第四步、验证

重启服务器,reboot

但是发现启动时,依然没有成功实现自启动。我使用了

代码语言:javascript
复制
java /etc/profile

但是,我在脚本中加入了这个刷新profile的命令,但是依然,没有实现自启动。我想到了之前看到网上的文章说,可能会出现java还没启动,启动jar包就不可能启动。但是我想应该不会是这个问题。同时还有人说是因为脚本中java找不到。

我将脚本的命令改成了绝对路径,之后成功的启动了。需要将上面的脚本改一下:

代码语言:javascript
复制
nohup java -jar $GIGASSISTSVC > $GIGASSISTSVC_log 2>&1 & =>  nohup /usr/local/jdk1.8.0_301/bin/java -jar $GIGASSISTSVC > $GIGASSISTSVC_log 2>&1 &

nohup java -jar $DEMO > $DEMO_log 2>&1 &  => nohup /usr/local/jdk1.8.0_301/bin/java -jar $DEMO > $DEMO_log 2>&1 &

再次使用reboot。

完成后,查看日志文件是否有添加相应的记录

果然就成功了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 后端技术学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如果出现linux中的服务宕机时,需要将一个一个的脚本启动起来,比较麻烦。那有什么办法可以一键启动多个脚本呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档