无法停止使用 systemctl start 启动的屏幕

无法停止使用 systemctl start 启动的屏幕

在 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⇒ 这只会挂起几秒钟,当它返回时,服务仍在运行。

然后我可以登录到屏幕会话并停止服务而无需重新启动它。但这到底是怎么回事?命令按预期工作,为什么 systemctl 无法停止(或重新启动)屏幕会话中的 java 进程?

答案1

正如这里的一位好心人指出的那样:https://serverfault.com/questions/1059919/cannot-stop-screen-started-with-systemctl-start/1059923#1059923

需要设置

KillMode=control-group.

并且可以省略

#ExecStop=/usr/bin/screen -r "minecraft-server" -X quit

当屏幕将 SIGTERM 传播到 jvm 时

相关内容