我想守护一个 Spring Boot 应用程序。我读了几篇关于如何做到这一点的文章和问题。例如,请参阅 this、this 和 this,但我无法让它工作。
这是我的逐步过程:
Hello World
$ curl -X GET http://localhost.com:8080
Hello World
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
/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
sudo systemctl daemon-reload
sudo systemctl enable spring-demo.service
sudo systemctl start spring-demo
sudo systemctl status spring-demo
服务应该启动
服务确实启动,但
systemd
立即停止服务,并在重复循环几次后将其置于失败状态。详细信息如下:
/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 $!
给了我空输出(这不是这个问题的主要问题)
我在这里做错了什么以及如何解决它?已经为此一整天了。
您是否重新启动了机器?似乎同一端口中有两个相同的 SpringBoot 线程。如果两个相同的线程监听同一个端口,SpringBoot的tomcat将无法启动成功。