Към съдържанието
PN Scripts

Игри

Рестарт по график на Minecraft сървър с Paper: предупреждения, запазване и повторно пускане

  • PN Scripts
  • 8 мин четене

Minecraft сървър, който работи от седмица, често е по-бавен от същия сървър след рестарт, а ежедневният рестарт в тих час е обичайното решение. Направен зле, той е и най-честата причина играчите да влязат ядосани: изгонени са по средата на строеж без нито дума, сървърът не се е върнал, докато някой не е забелязал сутринта, или рестартът е минал два пъти в нощта, в която часовниците се връщат назад. Тук разглеждаме какво прави един добър рестарт по график, по ред: кога да го пускате, как да предупредите играчите, какво запазва света и какво връща сървъра. Примерите са за Paper под Linux; примерът на Python и скриптът са пуснати точно както са отпечатани, а услугата за systemd мина собствената проверка на systemd.

#Защо изобщо да рестартирате

Плъгините и дългите сесии натрупват състояние: кешове, които растат, задачи, които се трупат, участъци от света, които остават заредени. Рестартът изчиства всичко това, прилага обновени плъгини и настройки и ви дава известна точка всеки ден, в която да направите резервно копие. Той не лекува сървър, който е твърде малък, или плъгин, който изтича памет, но поддържа здравия сървър здрав. Веднъж на ден в най-тихия час стига за повечето общностни сървъри; натоварените понякога добавят втори следобед.

#Изберете час, който съществува всеки ден

Най-тихите часове често са между 03:00 и 05:00, а точно тогава се сменя часовото време в повечето европейски страни. В България в последната неделя на март часовникът скача от 03:00 на 04:00, а в последната неделя на октомври се връща от 04:00 на 03:00. Затова рестарт, нагласен за 03:30, изобщо не се случва в една пролетна нощ и се случва два пъти в една есенна. Този пример го показва за 2026 г.:

from datetime import date, datetime, time, timezone
from zoneinfo import ZoneInfo

SOFIA = ZoneInfo("Europe/Sofia")


def restart_instants(day: date, at: time, tz=SOFIA):
    """Every real moment the wall clock shows `at` on `day`: none, one or two."""
    found = {}
    for fold in (0, 1):
        utc = datetime.combine(day, at, tzinfo=tz).replace(fold=fold).astimezone(timezone.utc)
        local = utc.astimezone(tz)
        if (local.date(), local.time()) == (day, at):  # the time really exists that day
            found[utc] = local
    return list(found.values())


for day in (date(2026, 3, 29), date(2026, 10, 25)):
    for at in (time(3, 30), time(4, 0)):
        moments = restart_instants(day, at)
        print(day, at, len(moments), [m.isoformat() for m in moments])

Той не отпечатва нито един момент за 03:30 на 29 март, отпечатва два за 03:30 на 25 октомври (веднъж с +03:00 и веднъж с +02:00, на час разстояние) и точно един за 04:00 и в двата дни. Затова или изберете час извън интервала от 03:00 до 04:00, например 04:00 или 05:00, или ползвайте планировчик, който знае какво да прави с липсващия и с повторения час. Сравнението на двата момента по времето им в UTC е важно: Python смята два часа в една и съща зона за равни, когато часовниците им показват едно и също, дори когато между тях има един час.

Задайте и часовата зона изрично. Сървър, нает в Германия или САЩ, може да работи в UTC и тогава „04:00“ в настройките му е 06:00 или 07:00 в София според сезона.

#Предупредете хората както трябва

Едно съобщение в чата десет минути преди рестарта се пропуска от всеки, който е зает. Това, което работи, е обратно броене, което става все по-настойчиво:

  • Съобщения в чата на 30, 15, 10, 5, 3 и 1 минута, после на всеки няколко секунди накрая, всяко с кратък звук.
  • Лента (boss bar) за последните пет минути, която показва точно оставащото време, за да не се налага никой да превърта чата.
  • Заглавие в средата на екрана за последната минута.
  • Езикът на самия играч. На български сървър половината играчи може да имат играта на английски, а половината на български; предупрежденията трябва да следват настройката на всеки играч.
  • Без порой след забавяне. Ако сървърът забие за двадесет секунди, играчите трябва да видят едно предупреждение с истинското оставащо време, а не пет остарели наведнъж.
  • Без броене към празен сървър. Ако няма никой онлайн, рестартирайте веднага.

#Запазване, изгонване, спиране

Командата stop записва всички промени на диска и после спира сървъра, така че светът е в безопасност, стига сървърът да спре нормално, а не да бъде убит. Добрата последователност пак си струва: около десет секунди преди края пуснете save-all и другите конзолни команди, които плъгините ви искат (стартиране на резервно копие, съобщение в Discord канал), после изключете всеки играч с учтиво съобщение като „Ежедневен рестарт, връщаме се след минута“ и чак тогава пуснете stop. Изгонването първо означава, че никой не губи предмет в последната секунда, защото още го е местил.

Това, което никога не бива да правите, е да прекратите процеса на Java с kill -9 или с бутона „kill“ на панела. Така запазването се прескача и всичко след последното автоматично запазване изчезва.

#Върнете сървъра

Плъгин може да спре сървъра, но нещо извън него трябва да го пусне отново. Има три обичайни начина.

Хостинг панел. Pterodactyl и повечето хостинги за Minecraft пускат сървъра отново, когато спре. Проверете го веднъж в тиха вечер със stop, преди да разчитате на това в четири сутринта.

Скрипт за стартиране с цикъл. На собствена машина пускайте сървъра от скрипт, който го стартира отново всеки път, когато спре:

#!/bin/sh
# Start Paper again whenever it stops. Ctrl+C during the pause ends the loop.
cd /opt/minecraft
while true; do
  java -Xms4G -Xmx4G -jar paper.jar nogui
  echo "Server stopped at $(date '+%H:%M:%S'); starting again in 10 seconds. Press Ctrl+C to quit."
  sleep 10
done

Пуснете го в сесия на screen или tmux, за да стигате до конзолата. В spigot.yml на Paper има настройка restart-script, по подразбиране ./start.sh, която системата му за рестарт изпълнява; с такъв цикъл не ви трябва. Имайте предвид, че съседната настройка restart-on-crash важи само когато наблюдателят (watchdog) на Paper убие замръзнал сървър, а не когато операционната система убие процеса.

Услуга за systemd. На Linux сървър услуга, която винаги се рестартира, е най-надеждният избор, защото пуска сървъра и след рестарт на машината:

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

[Service]
User=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms4G -Xmx4G -jar paper.jar nogui
Restart=always
RestartSec=10
SuccessExitStatus=0 143
TimeoutStopSec=90

[Install]
WantedBy=multi-user.target

Restart=always го пуска отново, както и да е приключил, RestartSec дава пауза, SuccessExitStatus приема кода на изход на Java след нормален сигнал за спиране за успех, а TimeoutStopSec дава на голям свят време да се запише, преди systemd да се откаже. Paper 26 иска Java 25, затова проверете, че /usr/bin/java е тази версия.

#Между рестартите

Същият плъгин, който брои обратно, е добро място за няколко сменящи се съобщения: правилата, връзката към Discord, напомняне за гласуване, по едно на всеки десет минути, на езика на всеки играч и без да се пращат към празен сървър. Екипът също има нужда да действа: да пусне рестарт след пет минути след обновяване на плъгин, да отложи нощния по време на събитие, да отмени обратно броене или да прескочи една нощ.

#Плъгин, който прави всичко това

Направихме Belfry, плъгин за Paper, който рестартира сървъра по график: произволен брой часове на ден в една часова зона, всеки ден или в избрани дни, като час в пролетната дупка се премества напред, а час, повторен през есента, се изпълнява веднъж. Предупреждава в чата със звънец, показва лента за последните минути и заглавие за последната, на езика на всеки играч (английски или български), прескача обратното броене, когато няма никой онлайн, пуска save-all или други конзолни команди преди спирането, изгонва играчите със съобщение и спира сървъра, за да го пусне отново хостингът или скриптът ви. С команди екипът пуска, отлага, отменя или прескача рестарти, по желание проверка за нисък TPS може да пусне рестарт, а между рестартите се показват сменящи се съобщения. Иска Paper 26.1 или по-нов с Java 25 и е тестван с автоматични тестове на MockBukkit с Paper 26.2 API, но не и на истински сървър. Обявен е като „Очаквайте скоро“.

#Често задавани въпроси

Колко често трябва да се рестартира Minecraft сървър?

Веднъж на ден в най-тихия час подхожда на повечето общностни сървъри. Натоварените или силно модифицираните сървъри понякога се рестартират два пъти на ден; сървър, който има нужда от повече, има проблем, който рестартът само крие.

Запазва ли /stop света?

Да. Записва всички промени на диска и после спира сървъра. Убиването на процеса на Java вместо това прескача запазването.

Защо сървърът ми не се върна след рестарт?

Защото нищо не го е пуснало отново. Плъгинът може само да спре сървъра; хостинг панелът, скрипт с цикъл или услуга за systemd с Restart=always трябва да го пусне.

Защо рестартът ми мина два пъти или изобщо не мина в една нощ?

Защото е нагласен в часа, в който се сменя часовото време. В България интервалът от 03:00 до 04:00 се прескача през пролетта и се повтаря през есента; изберете 04:00 или по-късно или планировчик, който се справя и с двата случая.

#Източници

Коментари

Коментари

Напишете първия коментар.

Оставете коментар

Следваща стъпка

pnscripts.com/bg/contact

Пишете на екипа

Попитайте за статия или ни разкажете за проект, който искате да изградим. Отговаряме до един работен ден.

Пишете ни

Семейството PN Scripts

Другите сайтове на PN Scripts

Хостингът, игрите и блогът имат свои сайтове, поддържани от същата компания.

  • pnscripts.com

    PN Scripts

    Софтуерно инженерство

    Уеб и мобилни приложения, API и игри по поръчка, плюс нашите продукти и плъгини с отворен код.

  • games.pnscripts.com

    Игри

    Игри и игрови сървъри

    Домът на игрите на PN Scripts: безплатни браузърни игри, които се играят веднага, а игровите сървъри предстоят.

  • hosting.pnscripts.com

    Хостинг

    Хостинг и инфраструктура

    Споделен хостинг, KVM VPS, самостоятелни сървъри и домейни от същата компания, която изработва проекта ви.

  • blog.pnscripts.com

    Блог

    Статии и бележки

    Практични статии за разработка на софтуер, хостинг, отворен код и игри, писани от хората, които ги създават.

    Вие сте тук