使用 systemd 守护 Spring boot Java 应用程序时出现问题

问题描述 投票:0回答:1

我想守护一个 Spring Boot 应用程序。我读了几篇关于如何做到这一点的文章和问题。例如,请参阅 thisthisthis,但我无法让它工作。

这是我的逐步过程:

  1. 首先,我创建了一个示例 Spring 演示应用程序,如果需要,可以在 here 找到该应用程序。它所做的只是暴露一个返回
    Hello World
  2. 的端点
$ curl -X GET http://localhost.com:8080
Hello World
  1. 我根据上面的文章创建了这个
    launcher.sh
    bash 脚本来启动 spring 应用程序:
#!/bin/bash
# https://stackoverflow.com/a/246128/147530
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
# Specify the path to your Java application JAR file
APP_DIR="$SCRIPT_DIR/.."
echo "$APP_DIR"

start() {    
  # TODO: need to ensure that application is not already running
    cd $APP_DIR 
    # https://stackoverflow.com/a/7814594/147530
    # redirect both input and output to the null device
    echo "starting spring boot application..."
  nohup mvn spring-boot:run < /dev/null > /dev/null 2>&1 &
  echo $! > demo-app.pid
}

stop() {
  cd $APP_DIR 
  PID=$(cat demo-app.pid)
  echo "stopping spring boot application PID: $PID"
  kill $PID
}

case $1 in
  start)
    start
    ;;
  stop)
    stop
    ;;
  restart)
    stop
    start
    ;;
  *)
    echo "Usage: $0 {start|stop|restart}"
    exit 1
    ;;
esac
  1. 然后我在
    /etc/systemd/system
    中创建了以下文件:
[Unit]
Description=Spring Demo App
After=syslog.target

[Service]
ExecStart=/app/spring-demo-app/daemon/launcher.sh start
ExecStop=/app/spring-demo-app/daemon/launcher.sh stop
ExecReload=/app/spring-demo-app/daemon/launcher.sh restart
User=xxx
Restart=on-failure

[Install]
WantedBy=multi-user.target
  1. 之后我执行了以下步骤:
sudo systemctl daemon-reload
sudo systemctl enable spring-demo.service
sudo systemctl start spring-demo
sudo systemctl status spring-demo

预计

服务应该启动

观察到

服务确实启动,但

systemd
立即停止服务,并在重复循环几次后将其置于失败状态。详细信息如下:

  1. 参见/var/log/syslog中的
    日志
    。在日志中观察:
2023-11-07T00:34:46.568688+00:00 instance-1 systemd[1]: Started spring-demo.service - Spring Demo App.
2023-11-07T00:34:46.575478+00:00 instance-1 launcher.sh[66104]: /app/spring-demo-app/daemon/..
2023-11-07T00:34:46.575982+00:00 instance-1 launcher.sh[66104]: starting spring boot application...
2023-11-07T00:34:46.586625+00:00 instance-1 launcher.sh[66108]: /app/spring-demo-app/daemon/..
2023-11-07T00:34:46.587937+00:00 instance-1 launcher.sh[66108]: stopping spring boot application PID: 66107

我已经验证我是否尝试使用

ExecStart
中的命令启动应用程序,它是否有效:

/app/spring-demo-app/daemon/launcher.sh start

应用程序启动,尽管

echo $!
给了我空输出(这不是这个问题的主要问题)

我在这里做错了什么以及如何解决它?已经为此一整天了。

java spring-boot systemd
1个回答
0
投票

您是否重新启动了机器?似乎同一端口中有两个相同的 SpringBoot 线程。如果两个相同的线程监听同一个端口,SpringBoot的tomcat将无法启动成功。

© www.soinside.com 2019 - 2024. All rights reserved.