我有一个 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