С помощью косвенного расширения (, также иногда называемого «переменной косвенностью» ),
ev=USER
printf '%s\n' "${!ev}"
Это описано в руководствеbash
(5.0 )в разделе «Расширение параметров».
Или, сделав ev
ссылку на имя, (требует bash
4.3+ ),
declare -n ev=USER
printf '%s\n' "$ev"
Это описано в руководствеbash
(5.0 ), как раз перед разделом «Позиционные параметры».
Я нашел решение для этого, но я не смогу просмотреть вывод с помощью 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"
.
Я подозреваю, что вы наткнулись на этот пост в блоге , который использует 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
установить правила игры, распределить игроков и начать событие.