Автозапуск Minecraft-сервера: служба systemd и cron-задание

Опубликовано Обновлено 4 мин. чтения

После перезагрузки сервера Minecraft-сервер должен запускаться сам. Показываем unit-файл systemd как аккуратное решение и cron-задание с @reboot как альтернативу.

Нужно, чтобы ваш Minecraft-сервер после перезагрузки root-сервера сам возвращался в онлайн, без входа по SSH? Тогда этот материал для вас.

Мы покажем два пути: служебный unit systemd как аккуратное и рекомендуемое решение, а также классическое cron-задание с @reboot как быструю альтернативу. Оба варианта работают во всех распространённых дистрибутивах Linux, то есть в Debian, Ubuntu, AlmaLinux и Rocky Linux.

systemd или cron-задание: какой путь правильный?

Cron-задание с @reboot настраивается быстро, но знает лишь один момент времени: старт системы. Если при этом что-то пойдёт не так или сервер позже упадёт, больше ничего не произойдёт.

Служебный unit systemd — это аккуратный путь, и он даёт сразу несколько преимуществ:

  • Сервер стартует только тогда, когда сеть действительно готова, а не по угаданному времени ожидания.
  • После сбоя systemd перезапускает сервер автоматически.
  • Сервером вы управляете привычными командами systemctl start, stop, restart и status.
  • Сообщения об ошибках попадают в журнал и доступны через journalctl.

Поэтому мы рекомендуем путь через systemd. Cron-задание описано ниже как альтернатива для случаев, когда systemd недоступен.

Подготовка: записываем команду запуска, пользователя и каталог

Прежде чем начать, вам понадобятся три сведения из вашей текущей установки:

  • Команда запуска из вашего файла «start.sh», то есть, например, screen -dmS spigot java -Xmx4G -jar spigot.jar
  • Пользователь, от имени которого работает сервер, в примере «spigot»
  • Каталог, в котором лежит файл сервера, в примере /home/spigot/server

Типичное содержимое start.sh выглядит так:

#Это лишь пример. Используйте содержимое вашего собственного start.sh.

screen -S spigot java -Xmx2G -jar spigot.jar

Важно: для автоматического запуска screen -S обязательно нужно заменить на screen -dmS. Причина: screen -S открывает интерактивную сессию и ожидает терминал. При старте системы терминала нет, поэтому запуск завершился бы ошибкой. screen -dmS, напротив, запускает сессию сразу в фоне.

Если Minecraft-сервер у вас ещё не настроен, сначала поможет наше руководство Установка Minecraft-сервера на Debian.

Создаём служебный unit systemd для Minecraft-сервера

Создание unit-файла

Создайте от имени root новый файл службы:

nano /etc/systemd/system/minecraft.service

Внесите следующее содержимое и приведите пользователя, каталог, объём оперативной памяти и имя файла в соответствие со своей установкой:

[Unit]
Description=Minecraft-Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
User=spigot
WorkingDirectory=/home/spigot/server
ExecStart=/usr/bin/screen -dmS spigot java -Xmx4G -jar spigot.jar
ExecStop=/usr/bin/screen -S spigot -X stuff "stop\n"
Restart=on-failure
RestartSec=15

[Install]
WantedBy=multi-user.target

Самые важные строки вкратце:

  • After и Wants следят за тем, чтобы сервер стартовал только после того, как сеть станет доступна.
  • User задаёт, от имени какого пользователя работает сервер. Никогда не запускайте его от root.
  • WorkingDirectory — это каталог с файлом сервера. Без этого указания Java не найдёт JAR-файл.
  • ExecStop отправляет команду «stop» в screen-сессию. Благодаря этому сервер аккуратно сохраняет мир, вместо того чтобы быть просто убитым.
  • Restart=on-failure автоматически перезапускает сервер после сбоя, а RestartSec задаёт время ожидания в секундах.

Сохраните файл сочетанием «Ctrl + X», затем «Y» и «Enter».

Активация и запуск службы

После этого systemd считывает новый файл, включает автозапуск и сразу стартует сервер:

systemctl daemon-reload
systemctl enable --now minecraft

Текущее состояние проверяется командой:

systemctl status minecraft

Если в выводе отображается «active», служба работает. При проблемах точное сообщение об ошибке выдаёт журнал:

journalctl -u minecraft -n 50

Доступ к консоли сервера

Сервер по-прежнему работает в screen-сессии. Поскольку она принадлежит пользователю «spigot», сначала переключитесь на этого пользователя, а затем откройте консоль:

su spigot
screen -r spigot

Сочетанием «Ctrl + A + D» вы выходите из консоли, не завершая сервер.

Остановка и перезапуск сервера

С этого момента сервером вы управляете через systemd:

systemctl stop minecraft
systemctl restart minecraft

Если автозапуск нужно снова отключить, достаточно:

systemctl disable minecraft

Альтернатива: автозапуск через cron-задание с @reboot

Если создавать служебный unit не хочется, автозапуск можно получить и через crontab соответствующего пользователя. Откройте crontab командой:

export VISUAL=nano; crontab -e

Добавьте свою команду запуска последней строкой с префиксом @reboot:

@reboot <содержимое вашего файла start.sh>

#Примерно так должен выглядеть параметр запуска, у вашего стартового скрипта он может отличаться.

@reboot screen -dmS <имя-screen-сессии> java -Xmx<AMOUNT>G -jar <каталог и имя файла Minecraft-сервера>.jar


#ПРИМЕР:
@reboot screen -dmS spigot java -Xmx2G -jar /home/spigot/spigot.jar

Следите и здесь за тем, чтобы использовался screen -dmS, а не screen -S. Как таким же способом запускать при старте сервера любые другие приложения и скрипты, показывает наше руководство Автоматический запуск программ при старте сервера.

Проверка автозапуска

Не полагайтесь на то, что конфигурация верна, а осознанно проверьте её один раз. Перезагрузите сервер:

reboot

Подождите одну-две минуты, снова войдите по SSH и проверьте командой systemctl status minecraft или screen -ls, работает ли Minecraft-сервер снова. Дополнительно подключитесь игровым клиентом, чтобы убедиться, что сервер действительно доступен.

Частые ошибки при автозапуске

  • screen -S вместо screen -dmS: самая частая ошибка с большим отрывом. Без -dm сервер при загрузке не стартует.
  • Неверный каталог: Java не находит JAR-файл. Проверьте WorkingDirectory или укажите в cron-задании полный путь к JAR-файлу.
  • Неверный пользователь: если служба работает от root, вновь созданные файлы мира затем принадлежат root, и собственный пользователь сервера больше не может в них писать.
  • Слишком мало оперативной памяти: если значение после -Xmx больше, чем объём свободной оперативной памяти, ядро завершает процесс Java вскоре после старта.

Частые вопросы

systemd или cron-задание: что выбрать?
Служебный unit systemd — более аккуратное решение. Он запускает сервер только тогда, когда сеть готова, автоматически перезапускает его после сбоя и управляется командами systemctl start, stop и status. Cron-задание с @reboot ничего из этого не предлагает.
Почему screen -S нужно менять на screen -dmS?
screen -S открывает интерактивную сессию и ожидает терминал. При старте системы терминала нет, поэтому запуск завершается ошибкой. screen -dmS запускает сессию в фоне и потому является правильным вариантом для автозапуска.
Как попасть в консоль сервера после автоматического запуска?
Сначала войдите под тем пользователем, от имени которого работает служба, а затем откройте сессию командой screen -r. Screen-сессия всегда принадлежит только тому пользователю, который её запустил.
Перезапустит ли systemd мой сервер после сбоя?
Да, если в unit-файле указано Restart=on-failure. Тогда systemd запускает сервер заново по истечении времени ожидания, заданного в RestartSec.
Как проверить, что автозапуск действительно работает?
Осознанно перезагрузите сервер командой reboot и затем проверьте командой systemctl status minecraft, работает ли служба. При ошибках точное сообщение показывает journalctl -u minecraft.

Minecraft-сервер Автозапуск systemd cron-задания crontab Linux Игровой сервер Debian