Как управлять службой systemd с помощью экрана?

С помощью косвенного расширения (, также иногда называемого «переменной косвенностью» ),

ev=USER
printf '%s\n' "${!ev}"

Это описано в руководствеbash(5.0 )в разделе «Расширение параметров».

Или, сделав evссылку на имя, (требует bash4.3+ ),

declare -n ev=USER
printf '%s\n' "$ev"

Это описано в руководствеbash(5.0 ), как раз перед разделом «Позиционные параметры».

3
13.07.2020, 11:56
2 ответа

Я нашел решение для этого, но я не смогу просмотреть вывод с помощью systemctl status spigot.

#!/bin/bash

while true; do
    cd /home/mcserver/Spigot
    echo Starting Spigot...
    screen -d -m -S Spigot java -jar spigot.jar
    SCREEN_NAME="Spigot"
    while screen -list | grep -q $SCREEN_NAME
    do
        sleep 1
    done
    echo Server has stopped, starting again in 5 minutes...
    sleep 300
done

Этот сценарий будет ожидать завершения сеанса экрана. Теперь я могу просматривать вывод или взаимодействовать с консолью, используя screen -r, или, если у меня запущено несколько сеансов экрана, я могу подключиться, используя screen -D -R "Spigot".

0
18.03.2021, 23:20

Я подозреваю, что вы наткнулись на этот пост в блоге , который использует screenдля решения проблемы, когда ваш сервер minecraft останавливается, когда вы $ java -jar spigot.jar, а затем закрываете сеанс ssh или putty. Этот метод, похоже, стал каноническим ответом на вопрос, как запустить сервер Minecraft, хотя в этом нет необходимости.

systemd — это совершенно другое (и лучшее )решение этой проблемы, обходя необходимость в screen.Вы можете добиться всего, что вы сделали в своем скрипте, с опциями службы systemd.


Чтобы запустить сервер vanilla minecraft, создайте /etc/systemd/system/minecraft.serviceс этим содержимым:

[Unit]
Description=Minecraft Server

[Service]
Type=simple
WorkingDirectory=/home/minecraft
ExecStart=java -Xmx1024M -Xms1024M -jar /home/minecraft/server.jar nogui
User=minecraft
Restart=on-failure

[Install]
WantedBy=multi-user.target

Настройте его на автоматический запуск после загрузки с помощью systemctl enable minecraft.

Вы спрашивали, как им управлять:

$ sudo systemctl start minecraft   # Starts the service if it wasn't running
$ sudo systemctl stop minecraft    # Stops the service
$ sudo systemctl restart minecraft # Restarts the service
$ sudo systemctl status minecraft  # Find out how the service is doing
$ sudo journalctl -u minecraft -f  # Monitor the logs

Это делает все, кроме возможности отправлять команды на консоль. Для этого мы создадим файл, который сервер будет прослушивать, где вы сможете писать свои команды, создавая следующие модули systemd:

/etc/systemd/system/minecraft.socket:

[Unit]
PartOf=minecraft.service

[Socket]
ListenFIFO=%t/minecraft.stdin

и/etc/systemd/system/minecraft.service:

[Unit]
Description=Minecraft Server

[Service]
Type=simple
WorkingDirectory=/home/minecraft
ExecStart=java -Xmx1024M -Xms1024M -jar /home/minecraft/server.jar nogui
User=minecraft
Restart=on-failure
Sockets=minecraft.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal

[Install]
WantedBy=multi-user.target

Теперь вы можете отправлять консольные команды, выводя данные в этот файл:

echo "help" > /run/minecraft.stdin
echo "/stop" > /run/minecraft.stdin

Что также здорово, так это то, что вы можете создавать свои собственные последовательности команд и catвесь файл в консоли. Например, если вы играете в UHC , вы можете начать новый мир, заставить людей войти -, а затем cat uhc.commands > /run/minecraft.stdinустановить правила игры, распределить игроков и начать событие.

12
18.03.2021, 23:20

Теги

Похожие вопросы