Вопрос или проблема
Я пытаюсь запустить сервер игры Minecraft в своей домашней лаборатории. Устройство, которое я использую для этого, работает под управлением Debian 12 внутри виртуальной машины.
Сам сервер игры уже правильно настроен, все его сетевые настройки сконфигурированы, и он работает нормально, когда я запускаю его вручную.
Поскольку я хочу, чтобы сервер игры был доступен 24/7, а машина, на которой он работает, регулярно перезагружается для применения определенных патчей, я хочу автоматизировать запуск и остановку сервера. Для этого я попытался настроить службу systemd, которая запускает сервер, как только система запускается, и останавливает его, когда она отключается. Файл службы выглядит следующим образом (имейте в виду, что это мой первый опыт работы с службами, и я пока еще довольно неопытен в bash):
minecraftserver.service
[Unit]
Description=Сервер Minecraft
# Запускать после инициализации сетевых служб
After=network.target
[Service]
User=m700-b
ExecStart=/location/of/java -XX:somejavaoptions -jar minecraft.jar nogui
# С этого момента все остальное - всего лишь догадки, и ничего не сработало
ExecStartPost=/bin/bash -c 'echo $MAINPID > /run/minecraftserver.pid'
ExecStop=/bin/bash -c 'echo "/stop" > /proc/$(cat /run/minecraftserver.pid)/fd/0 && rm -f /run/minecraftserver.pid'
PIDFile=/run/minecraftserver.pid
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
Что я пытаюсь сделать здесь, так это заставить сервер игры остановиться “гладко”. Я не могу просто завершить все процессы, которые он запустил (сервер Minecraft создает или форкает подпроцессы), так как это имеет высокую вероятность вызвать потерю данных.
Запуская сервер вручную в терминале, я могу вводить команды, которые сервер затем выполняет, прямо в окне терминала. Поэтому я предполагаю, что могу отправить строку в его stdin, чтобы заставить его выполнить команду “/stop”, что заставляет сервер игры отключаться обычным образом, сохраняя игру и выполняя всю необходимую очистку.
Мне нужна помощь, чтобы сделать это правильно, потому что я не понимаю, как я:
- найти правильный процесс для обращения
- отправить команду /stop в его stdin, чтобы он остановился
Код, который вы видите выше, был моей третьей неудачной попыткой в этом. Что я делаю не так/как я могу сделать лучше?
Ответ или решение
Автоматизация Запуска и Остановки Minecraft Серверов на Debian с Использованием Systemd
Если вы хотите запустить Minecraft сервер в вашем homelab на операционной системе Debian 12 и обеспечить его автоматический запуск и остановку при перезагрузке системы, то создание systemd
сервиса является отличным решением. В этом руководстве мы рассмотрим, как правильно настроить сервис для вашего Minecraft сервера.
1. Создание и Настройка Файла Сервиса
Ваша попытка создать файл сервиса для systemd
выглядит многообещающе, но требует небольших доработок. Вот рекомендуемая структура файла minecraftserver.service
:
[Unit]
Description=Minecraft server
After=network.target
[Service]
User=m700-b
WorkingDirectory=/path/to/minecraft_server_directory
ExecStart=/path/to/java -XX:somejavaoptions -jar minecraft.jar nogui
ExecStop=/bin/bash -c 'echo "/stop" > /proc/$(cat /run/minecraftserver.pid)/fd/0 && rm -f /run/minecraftserver.pid'
PIDFile=/run/minecraftserver.pid
StandardInput=pipe
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
2. Основные Компоненты Файла Сервиса
-
After=network.target: Эта строка указывает, что сервис должен запускаться только после того, как сетевые службы будут активны, что очень важно для игры типа Minecraft.
-
User=m700-b: Запускает сервер от имени указанного пользователя. Убедитесь, что этот пользователь имеет необходимые права доступа.
-
WorkingDirectory: Добавлен для установки рабочего каталога, необходимо чтобы сервер правильно находил файлы конфигурации.
-
ExecStart: Здесь вы указываете команду для старта Minecraft сервера. Убедитесь, что путь к
java
иminecraft.jar
корректны. -
ExecStop: В этой строке происходит посыл команды "/stop" на стандартный ввод процесса Minecraft. Обратите внимание, что для этого используется
pipe
. -
StandardInput=pipe: Указывает, что стандартный ввод является
pipe
, что позволяет передавать данные процессу через стандартный ввод. -
Restart: Помогает автоматически перезапускать сервер в случае его сбоя.
3. Границы Поиска Процесса
Ваша первоначальная проблема заключалась в том, как найти правильный процесс для отправки команды. Используя PIDFile=/run/minecraftserver.pid
, мы сохраняем PID процесса Minecraft в специально отведенный файл, что упрощает управление сервером.
4. Запуск и Остановка Сервиса
После создания файла сервиса (например, в /etc/systemd/system/minecraftserver.service
), выполните следующие команды для его активации и запуска:
sudo systemctl daemon-reload
sudo systemctl enable minecraftserver.service
sudo systemctl start minecraftserver.service
daemon-reload
: Перезагрузка конфигурацииsystemd
, чтобы он распознавал новое или обновленное определение сервиса.enable
: Активирует автоматический запуск сервиса при загрузке системы.start
: Запускает сервер немедленно.
5. Проверка Статуса Сервиса
Для проверки статуса вашего сервиса используйте команду:
sudo systemctl status minecraftserver.service
Это поможет вам определить, запущен ли сервер и есть ли какие-либо ошибки.
Заключение
Настройка systemd
сервиса для Minecraft сервера предоставляет много возможностей для автоматизации управления вашим игровым сервером. Следуя вышеописанным шагам, вы сможете настроить надежное решение для автоматического запуска и остановки сервера при перезагрузке системы без риска потери данных. Если у вас возникнут дополнительные вопросы или потребуется помощь в настройке, не стесняйтесь обращаться за поддержкой или консультацией.