Использование системных служб systemd в Debian для автоматизации запуска и остановки сервера Minecraft

Вопрос или проблема

Я пытаюсь запустить сервер игры 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”, что заставляет сервер игры отключаться обычным образом, сохраняя игру и выполняя всю необходимую очистку.

Мне нужна помощь, чтобы сделать это правильно, потому что я не понимаю, как я:

  1. найти правильный процесс для обращения
  2. отправить команду /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 сервера предоставляет много возможностей для автоматизации управления вашим игровым сервером. Следуя вышеописанным шагам, вы сможете настроить надежное решение для автоматического запуска и остановки сервера при перезагрузке системы без риска потери данных. Если у вас возникнут дополнительные вопросы или потребуется помощь в настройке, не стесняйтесь обращаться за поддержкой или консультацией.

Оцените материал
Добавить комментарий

Капча загружается...