为什么我的 Spring Boot 服务没有启动

为什么我的 Spring Boot 服务没有启动

我有一个 Spring Boot 服务,正在尝试在我的 Ubuntu 20.04 服务器上运行。

我在 /etc/systemd/system 中创建了一个服务文件,这是目录条目。

-rw-r--r-- 1 root root  116 Jun  5 15:10 wfwweb.service

以下是内容

[Unit]
After=network.service

[Service]
ExecStart=/usr/local/bin/wfwweb-start.sh

[Install]
WantedBy=default.target

接下来,我在 usr/local/bin 中创建了 shell 脚本,这是该目录条目。

-rwxr--r-- 1 root root 169 Jun  5 16:42 wfwweb-start.sh

其中包含以下内容:

#!/bin/bash

java -version >> /var/log/wfwweb/wfwweb.log 2>&1 &
java -jar -Dspring.profiles.active=dev /opt/server/wfwweb-0.9.1.jar >> /var/log/wfwweb/wfwweb.log 2>&1 &

最后,我在 /var/log 中创建了一个目录,并将其设置为用于 logrotate。以下是该目录条目。

ubuntu@ip-172-31-21-200:/var/log/wfwweb$ ls -lt
total 8
-rw-r--r-- 1 root root 7100 Jun  5 18:16 wfwweb.log
ubuntu@ip-172-31-21-200:/var/log/wfwweb$ 

重新启动时,这是我在系统日志中看到的唯一条目(与此相关)。

Jun  5 18:17:43 ip-172-31-21-200 systemd[1]: wfwweb.service: Succeeded.

但是服务器没有运行并且日志文件中没有任何内容。

如果我输入sudo /usr/local/bin/wfwweb-start.sh

服务器启动并且日志文件充满消息。

所以这肯定是某种权限问题,但我看不出来。还有人看出来了吗?

答案1

如果您打算分叉您的应用程序,您需要使用Type=forking,否则一旦应用程序被置于后台,您的.service就会终止。

类型=
如果设置为 forking,则预期使用 ExecStart= 配置的进程将在启动过程中调用 fork()。预期在启动完成且所有通信通道都设置好后,父进程将退出。子进程继续作为主服务进程运行,服务管理器将在父进程退出时认为该单元已启动。这是传统 UNIX 服务的行为。如果使用此设置,建议同时使用 PIDFile= 选项,以便 systemd 可以可靠地识别服务的主进程。一旦父进程退出,systemd 将继续启动后续单元。

[Unit]
Description=Spring boot service wfwweb
After=network.target

[Service]
SuccessExitStatus=143
Type=forking
ExecStartPre=java -version
ExecStart=/bin/bash -c \
    'exec -a wfwweb java -jar -Dspring.profiles.active=dev /opt/server/wfwweb-0.9.1.jar &'
# User=user
#Group=group
StandardOutput=append:/var/log/wfwweb/wfwweb.log
 StandardError=append:/var/log/wfwweb/wfwweb.log
Restart=always
WorkingDirectory=/opt/server

[Install]
WantedBy=Multi-user.target

相关内容