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 или по-късно или планировчик, който се справя и с двата случая.
Коментари
Коментари
Напишете първия коментар.
Оставете коментар