service - 启动 Spring Boot 应用程序作为服务

  显示原文与译文双语对照的内容
118 4

如何在linux系统中将打包为可以执行 jar的Spring Boot 应用程序配置成?建议采用这里方法,还是应该将这里应用程序转换为war并安装到?

现在我可以从 screen 会话运行 Spring Boot 应用程序,什么是好的,但是在服务器重启后需要手动启动。

如果我的方法是正确的,那么我要寻找的是一般建议/方向或者示例 init.d 脚本,如果我的方法。

时间:原作者:0个回答

82 4

我刚刚自己来做这个,所以以下是一个关于of服务控制器脚本的到目前为止。到目前为止,它工作得非常好,但我并不是 leet,黑客,所以我相信有改进的空间。

首先,我有一个简短的配置脚本/data/svcmgmt/conf/my-spring-boot-api.sh对于每个设置 环境变量的服务。

#!/bin/bash
export JAVA_HOME=/opt/jdk1.8.0_05/jre
export APP_HOME=/data/apps/my-spring-boot-api
export APP_NAME=my-spring-boot-api
export APP_PORT=40001

为了确保我的服务在重启后启动,我使用 CentOS,在 /etc/init.d/my-spring-boot-api 中我有一个服务控制脚本:

#!/bin/bash
# description: my-spring-boot-api start stop restart
# processname: my-spring-boot-api
# chkconfig: 234 20 80
./data/svcmgmt/conf/my-spring-boot-api.sh
/data/svcmgmt/bin/spring-boot-service.sh $1
exit 0

可以看到,调用初始配置脚本来设置 环境变量,然后调用一个共享脚本,我用来重新启动所有 Spring Boot 服务。这个共享脚本就是它所有的肉都可以以找到的地方:

#!/bin/bash
echo"Service [$APP_NAME] - [$1]"
echo" JAVA_HOME=$JAVA_HOME"
echo" APP_HOME=$APP_HOME"
echo" APP_NAME=$APP_NAME"
echo" APP_PORT=$APP_PORT"
function start {
 if pkill -0 -f $APP_NAME.jar>/dev/null 2>&1
 then
 echo"Service [$APP_NAME] is already running. Ignoring startup request."
 exit 1
 fi
 echo"Starting application..."
 nohup $JAVA_HOME/bin/java -jar $APP_HOME/$APP_NAME.jar 
 --spring.config.location=file:$APP_HOME/config/
 </dev/null> $APP_HOME/logs/app.log 2>&1 &
}
function stop {
 if! pkill -0 -f $APP_NAME.jar>/dev/null 2>&1
 then
 echo"Service [$APP_NAME] is not running. Ignoring shutdown request."
 exit 1
 fi
 # First, we will try to trigger a controlled shutdown using 
 # spring-boot-actuator
 curl -X POST http://localhost:$APP_PORT/shutdown </dev/null>/dev/null 2>&1
 # Wait until the server process has shut down
 attempts=0
 while pkill -0 -f $APP_NAME.jar>/dev/null 2>&1
 do
 attempts=$[$attempts + 1]
 if [ $attempts -gt 5 ]
 then
 # We have waited too long. Kill it.
 pkill -f $APP_NAME.jar>/dev/null 2>&1
 fi
 sleep 1s
 done
}
case $1 in
start)
 start
;;
stop)
 stop
;;
restart)
 stop
 start
;;
esac
exit 0

当停止时,它将尝试使用 Spring Boot 执行器执行控制的关闭。但是,如果在合理的时间帧( 我给它 5秒,这有点短) 中没有配置或者失败,则该过程将被杀死。

这里外,脚本假设运行appllication的java进程将是流程详细信息文本中唯一的"my-spring-boot-api 。jar"。这是我环境中一个安全的假设,意味着我不需要跟踪 pid 。

原作者:
110 5

如果你想使用 Spring Boot 1.2.5与 Spring Boot Maven 插件 1.3.0. M2, 在这里is解决方案:

<parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.2.5.RELEASE</version>
</parent>
<build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <version>1.3.0.M2</version>
 <configuration>
 <executable>true</executable>
 </configuration>
 </plugin>
 </plugins>
</build>
<pluginRepositories>
 <pluginRepository>
 <id>spring-libs-milestones</id>
 <url>http://repo.spring.io/libs-milestone</url>
 </pluginRepository> 
</pluginRepositories>

然后编译为 ususal: mvn clean package,创建一个链接符号ln -s/.../myapp.jar/etc/init.d/myapp,让它成为可执行 chmod +x/etc/init.d/myapp 并启动 service myapp start ( 与Ubuntu服务器)

原作者:
...