答案当然是有的。
在一开始,我选择了参考网上所说的定义一个rc.local文件,修改/etc/rc.local,但发现这种方法可以实现自启动脚本,但是通常只能启动一个服务,然后后面的服务就不能启动了。这个是因为自己做了实验发现的。
还有一个问题就是有一些参考脚本里面的开头是#!/bin/sh -e,这样使得脚本不能启动,这个-e需要去掉。
接着我又准备尝试使用他们所说的一些自启动脚本,但是发现文章所写的,多少会有点错误,就是启动的时候,要进行权限的修改,同时在启动自启动脚本时,需要对需要启动的脚本的位置使用绝对路径,而不是相对路径,因为如果使用相对路径就会报一个错误:
Error: Unable to access jarfile 运行jar包报错
在网上查找资料,你会发现出现这个问题的原因只有两个
一个是写的jar包的路径一定需要是绝对路径
二就是你的安装的JDK与jar包中的JDK不是同一版本
因此发现问题就是路径的问题。
修改成绝对路径之后,问题还是没有得到解决。如果使用rc.local的脚本,我发现网上都是教你如何启动,但是没有教如何关闭、重启。而且处理不够优雅,比较粗暴,同时没有将启动的日志信息进行记录,不能很好的确认服务是否启动。
但是之后发现一篇文章写得还是比较人性化的,处理脚本的命令是比较可靠,同时处理服务启动是比较温和的。按照这篇文章的方式
Linux shell脚本,按顺序批量启动多个jar包,批量启动spring cloud的jar包
我在本地自己的虚拟机成功的启动了多个jar包,同时成功的部署了自己的jar包和war。当然这个脚本有一个问题就是jar包的位置应该写成绝对路径,否则的话,也会出现上面启动jar包启动不起来的错误。
这里贴上自己的命令,我使用的虚拟机是ubuntu18,因为公司使用的是阿里云的ubuntu:
#!/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脚本。如果可以
第三步、设置开机启动
设置开机启动前,需要再编辑脚本,在前两行添加以下代码
#!/bin/sh
#chkconfig:2345 80 90
#description:auto_run
#用于开机后,快速同时启动指定服务的脚本
把文件移动到/etc/init.d的目录下
[root@root myScript]# mv service_init.sh /etc/init.d
使用chkconfig命令将脚本添加到开机启动
[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
[root@root init.d]# sysv-rc-conf --add service_init.sh
[root@root init.d]# sysv-rc-conf service_init.sh on
第四步、验证
重启服务器,reboot
但是发现启动时,依然没有成功实现自启动。我使用了
java /etc/profile
但是,我在脚本中加入了这个刷新profile的命令,但是依然,没有实现自启动。我想到了之前看到网上的文章说,可能会出现java还没启动,启动jar包就不可能启动。但是我想应该不会是这个问题。同时还有人说是因为脚本中java找不到。
我将脚本的命令改成了绝对路径,之后成功的启动了。需要将上面的脚本改一下:
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。
完成后,查看日志文件是否有添加相应的记录
果然就成功了。