前段时间弄nginx开机自动启动,写了篇博客,很简单,直接在/etc/rc.d/rc.local文件中加入nginx启动命令,即实现了开机自动启动。

今天在弄springboot项目时,在/etc/rc.d/rc.local文件中加入启动命令:

nohup java -jar /root/jjlc/server/datainterface-0.0.1-SNAPSHOT.jar &

其中/root/jjlc/server/datainterface-0.0.1-SNAPSHOT.jar 为jar包存放的绝对路径,然后用bash命令执行脚本:bash /etc/rc.d/rc.local,服务可以正常启动。于是执行shutdown -r now命令立即重新启动系统,重启后发现微服务没有正常启动,又试了几次任然没有启动。于是网上找了下原因,发现别人开机启动Tomcat的时候,在启动Tomcat命令之前会把JAVA_HOME变量(可通过 vim /etc/profile 查看jdk所在位置)重新导入一下:
 

export JAVA_HOME=/usr/jdk1.8.0_144
/opt/apache-tomcat-8.0.32/bin/startup.sh &

于是自己在服务器上按照这个方式试了下Tomcat服务开机启动,开机后Tomcat果然可以正常启动,Tomcat下的应用也能正常访问。然后启动微服务时也导入Java的安装目录,/etc/rc.d/rc.local文件内容如下:

export JAVA_HOME=/usr/jdk1.8.0_144
nohup java -jar /root/jjlc/server/datainterface-0.0.1-SNAPSHOT.jar &

重启系统,但是微服务依然没有正常启动,想了下有可能是没有把Java的path和classpath变量导入,于是把这两个变量也导入,/etc/rc.d/rc.local文件内容如下:

export JAVA_HOME=/usr/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
nohup java -jar /root/jjlc/server/datainterface-0.0.1-SNAPSHOT.jar &

然后重启系统,发现服务可以正常启动了。分析下原因,Tomcat和Java启动jar包时,由于是开机就启动,估计当时启动的时候系统环境变量中所配置的Java虚拟机并不一定启动成功了,所以导致调用系统Java服务未成功,则启动失败。Tomcat在执行startup.sh命令时,catalina.sh文件中会根据JAVA_HOME变量自动找到对应的PATH和CLASSPATH,所以在执行Tomcat时只需要导入JAVA_HOME变量就可以开机自动启动了。但是在启动微服务时,如果只导入JAVA_HOME变量,直接执行java -jar命令,则找不到Java类路径,所以还要加上PATH和CLASSPATH变量。

由于该机器部署了nginx、Tomcat和微服务的项目,所以最终/etc/rc.d/rc.local文件开机自启的命令如下:

export JAVA_HOME=/usr/jdk1.8.0_144
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
nohup java -jar /root/jjlc/server/datainterface-0.0.1-SNAPSHOT.jar &
/opt/apache-tomcat-8.0.32/bin/startup.sh &
/opt/nginx/sbin/nginx

前三行是导入Java变量命令,第四行是微服务启动命令,第五行是Tomcat启动命令,第六行是nginx启动命令。