Linux

無法停止使用 systemctl start 啟動的螢幕

  • April 9, 2021

在 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
    • 它阻塞了終端
    • 從另一個外殼我可以進入螢幕會話
  • 以使用者 minecraft 登錄並執行screen -r "minecraft-server" -X quit退出正在執行的 Minecraft 伺服器
  • 殺死正在執行的服務的正在執行的java應用程序立即重新啟動服務

什麼不起作用

  • systemctl stop minecraft.service⇒ 這只是掛起幾秒鐘,當它返回時,服務仍在執行。是的仍在執行,未重新啟動(相同的 PID,沒有斷開連接,沒有新日誌)

然後我可以登錄到螢幕會話並停止服務,而不會被 systemctl 自動重新啟動。但到底是什麼?命令按預期工作,為什麼 systemctl 不能在螢幕會話中停止(或重新啟動)程序中的 java?

嘗試將服務定義行更改KillMode=noneKillMode=control-group.

如果可以,請測試一下;除非你有在 mode 下執行的目的none

人:systemd.kill

引用自:https://serverfault.com/questions/1059919