在 Ubuntu 服务器 20.04 上
我在这样的屏幕会话中为 Minecraft 服务器创建了一个服务定义
[Unit]
Description=Minecraft Server
After=network.target
[Service]
User=minecraft
Nice=1
KillMode=none
SuccessExitStatus=0 1
#ProtectHome=true
ProtectSystem=full
PrivateDevices=true
NoNewPrivileges=true
WorkingDirectory=/home/minecraft
ExecStart=/usr/bin/screen -AmDS "minecraft-server" /usr/bin/java -Xmx12G -Xms4G -jar /home/minecraft/minecraft-server.jar nogui
ExecStop=/usr/bin/screen -r "minecraft-server" -X quit
ExecStopPost=kill -9 $(ps -ef | grep '[/]home/minecraft/minecraft-server.jar' | grep -v SCREEN | awk '{print $2}')
ExecStopPost=rm -f /home/minecraft/Blumentopf/session.lock
Restart=always
RestartSec=2
[Install]
WantedBy=multi-user.target
什么有效
systemctl start minecraft.service
⇒ 屏幕会话启动,用户 Minecraft 可以进入- 以用户 minecraft 身份登录并执行
screen -AmDS "minecraft-server" /usr/bin/java -Xmx12G -Xms4G -jar
- 它阻塞了终端
- 从另一个 shell 我可以进入屏幕会话
- 以用户 minecraft 身份登录并执行
screen -r "minecraft-server" -X quit
退出正在运行的 Minecraft 服务器 - 终止正在运行的服务的正在运行的 Java 应用程序会立即重新启动该服务
什么不起作用
systemctl stop minecraft.service
⇒ 这只是挂起几秒钟,当它恢复时,服务仍在运行。是的,仍在运行,没有重新启动(相同的 PID,没有断开连接,没有新日志)
然后我可以登录到屏幕会话并停止服务,而无需 systemctl 自动重新启动它。但这是什么情况?命令按预期工作,为什么 systemctl 无法停止(或重新启动)屏幕会话中的 java 进程?