На сервере 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 может войти в него screen -AmDS "minecraft-server" / usr / bin / java -Xmx12G -Xms4G -jar
screen -r "minecraft-server" -X quit
выйти из запущенного Minecraft сервер Что не работает
systemctl stop minecraft.service
⇒ это просто зависает на несколько секунд, а когда возвращается, служба все еще работает. Затем я могу войти в сеанс экрана и остановить службу без ее перезапуска. Но какого черта? Команды работают должным образом, почему systemctl не может остановить (или перезапустить) Java в процессе в сеансе экрана?
Как отметил этот милый парень: 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
, так как экран передает ЗАПИСЬ на jvm