MAATRIX GAMES / Блог / Сервер не сохраняет прогресс: диагностика

Сервер не сохраняет прогресс: диагностика

MAATRIX GAMES

Заходите на сервер после рестарта — а там вчерашняя база не достроена, лута в сундуках меньше, чем оставляли, или вообще откат на несколько часов назад. Первая мысль обычно про "сервер сломался", но в 90% случаев дело не в поломке, а в том, что сохранение либо не запускалось, либо не успевало дописаться на диск до момента, когда процесс убили. Ниже — порядок проверки по пунктам, от самого частого к самому редкому, без гаданий.

Проверяем, что автосохранение вообще включено

Rust сохраняет мир сам, по таймеру, через консольную команду server.saveinterval (в секундах). Если кто-то когда-то поставил её в 0 или в неадекватно большое значение — сервер может неделями не писать save-файл на диск, и вы просто не замечали, потому что рестартов не было.

Проверить текущее значение можно прямо из консоли сервера или по RCON — вызовите переменную без аргумента, она вернёт текущую настройку:

server.saveinterval

Если стоит 0 — автосохранение выключено полностью, и это первая находка. Выставляйте разумный интервал в стартовых параметрах или в конфиге, который грузится при старте:

server.saveinterval 300

Дальше проверьте, что сохранение реально происходит, а не просто "настроено на бумаге". В консоли или в логе сервера при срабатывании таймера должна появляться строка вида Saving <world name>... и следом отчёт по времени сохранения. Если такие строки не появляются вообще — значит, таймер не тикает, и стоит проверить, не завершается ли процесс раньше, чем истекает интервал (актуально для серверов с частыми рестартами скриптом или хостинг-панелью).

Ручной save для проверки, что сама механика рабочая:

save

Эта команда форсирует немедленное сохранение — если после неё в папке с сохранениями обновилась дата изменения файла, значит запись на диск в принципе работает, и проблема не в самой игре, а где-то ниже по цепочке.

Где лежат сохранения и как проверить дату файла

Rust пишет мир в отдельную папку внутри server/<identity>/, где <identity> — имя, заданное параметром +server.identity при запуске (по умолчанию часто my_server_identity, но вы могли задать своё). Найти актуальный путь:

find / -iname "*.sav" 2>/dev/null

Основные файлы — <world>.sav, резервная копия предыдущего сохранения <world>.sav.bak и файл карты <world>.map. Смотрим дату изменения:

ls -la /home/rustserver/rust/server/<identity>/

Если .sav файл датирован часами или днями назад, а сервер всё это время работал — вот и подтверждение, что сохранения не долетают до диска. Дальше идём по причинам ниже.

Поднять сервер Rust за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Graceful shutdown vs аварийное завершение

Самая частая причина потери прогресса — не отсутствие автосохранения, а то, что процесс сервера убивают до того, как он успевает записать данные. kill -9 (или SIGKILL от систем мониторинга, которые считают процесс зависшим) не даёт Rust шанса доделать текущую операцию записи — файл может остаться недописанным или сервер вовсе не начнёт финальное сохранение при выходе.

Правильный путь — RCON-команда quit (или server.exit, в зависимости от версии сервера), которая инициирует штатное завершение с сохранением перед выходом:

quit

Если сервер запущен через systemd — важно, чтобы юнит останавливал процесс сигналом SIGTERM, а не SIGKILL, и давал время на сохранение перед тем, как считать процесс мёртвым. За настройку Restart=, KillSignal и таймаутов остановки подробно рассказано в статье про systemd, screen и tmux для игровых процессов — если у вас автозапуск через systemd и вы не трогали TimeoutStopSec, по умолчанию он может быть меньше, чем реально нужно серверу на сохранение большой карты, и systemd просто убьёт процесс силой, не дождавшись.

Отдельно проверьте, не завершает ли сервер хостинг-панель или скрипт рестарта через pkill -9 или kill -9 $(pgrep RustDedicated) — это частая практика в самописных крон-скриптах перезапуска по расписанию, и именно она чаще всего стоит за пропавшим прогрессом после планового рестарта. Если у вас настроен автозапуск при перезагрузке хоста, там же стоит свериться, как именно скрипт останавливает старый процесс — см. автозапуск игрового сервера при перезагрузке хоста.

Права доступа к папке сохранений

Если сервер не может писать в директорию server/<identity>/, он либо тихо промолчит в логе (в старых билдах это не всегда явная ошибка), либо выдаст что-то вроде отказа в доступе при попытке записи. Частая причина — папку когда-то создавали или чинили руками из-под root (например, при восстановлении бэкапа через scp или unzip), и владелец файлов сменился на root, а сам сервер работает от отдельного пользователя.

Проверка владельца и прав:

ls -la /home/rustserver/rust/server/

Если владелец не тот пользователь, от которого запущен процесс сервера — чиним:

sudo chown -R rustserver:rustserver /home/rustserver/rust/server/
sudo chmod -R u+rwX /home/rustserver/rust/server/

Замените rustserver на реального пользователя, от которого у вас крутится RustDedicated — посмотреть можно через ps aux | grep RustDedicated, колонка с именем пользователя покажет, кто на самом деле владеет процессом.

Отдельно проверьте права не только на саму папку сохранений, но и на родительские директории вплоть до корня установки — если где-то по цепочке стоит 700 для чужого пользователя, процесс не долезет до конечной папки, даже если права на неё самой правильные.

Не хватает места на диске

Самая обидная причина — сервер физически не может дописать файл, потому что диск заполнен под ноль. Save-файлы у Rust не маленькие: на картах 4000+ с активным вайпом каждый .sav может весить несколько гигабайт, и если параллельно копятся бэкапы, логи и апдейты через SteamCMD — место утекает быстрее, чем кажется.

Проверка:

df -h

Смотрите на раздел, где физически лежит папка с сервером (не всегда это тот же раздел, что корень системы, если у вас смонтирован отдельный диск под данные). Если свободного места меньше пары гигабайт — это уже красная зона: Rust может успешно писать .sav.bak, но не суметь дописать основной .sav, оставив мир в промежуточном состоянии.

Что обычно съедает место незаметно:

  • Старые .sav.bak копии, которые никто не чистит годами.
  • Логи консоли, если стартовые параметры пишут вывод в файл без ротации.
  • Кэш SteamCMD и недокачанные обновления после сбойного app_update.
  • Бэкапы карт, сложенные вручную "на всякий случай" и забытые.

Проверить, что именно занимает место:

du -sh /home/rustserver/rust/* | sort -rh | head -10

Освобождать место стоит аккуратно — не трогайте текущий .sav и свежий .sav.bak, чистите то, что старше нескольких вайпов.

Два процесса сервера конфликтуют за один save-файл

Реже, но метко: если случайно запущены два экземпляра RustDedicated с одинаковым +server.identity (например, старый процесс не завершился после неудачного рестарта, а скрипт автозапуска поднял новый поверх), оба будут пытаться писать в одну и ту же папку сохранений. Итог непредсказуем — от гонки за файл до порчи .sav, потому что оба процесса уверены, что владеют картой единолично.

Проверка на дубли:

ps aux | grep RustDedicated

Если в выводе больше одной строки с RustDedicated и одинаковым путём +server.identity — один из процессов лишний. Смотрите, какой из них реально держит игровой порт:

sudo ss -tulpn | grep 28015

(замените порт на свой, если меняли +server.port от значения по умолчанию). Процесс, который порт не держит, — зомби от предыдущего запуска, его нужно корректно остановить (по возможности через RCON quit, если он ещё отвечает, иначе kill, и только потом перезапускать штатным способом).

Такая ситуация типична, если сервер держат в screen/tmux сессии без systemd — старая сессия может "потеряться" из виду, пока новая уже поднялась. Если у вас именно такая схема запуска, стоит свериться со списком активных сессий (screen -ls или tmux ls) перед каждым ручным рестартом — подробнее про разницу подходов в статье про systemd, screen и tmux.

Поднять сервер Rust за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

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

Через сколько времени Rust сохраняет мир по умолчанию?

Зависит от настройки server.saveinterval — команда без аргумента в консоли покажет текущее значение на вашем сервере. Если параметр никогда не задавался явно в стартовых параметрах, ориентируйтесь на значение, которое покажет сама консоль, а не на цифры из чужих гайдов — билды и дефолты со временем меняются.

Можно ли восстановить прогресс из .sav.bak, если основной .sav побился?

Да, это резервная копия предыдущего успешного сохранения. Остановите сервер, переименуйте .sav.bak в .sav (сохранив оригинальный битый файл под другим именем на всякий случай) и запустите сервер заново — вы потеряете прогресс между двумя последними сохранениями, но не всё.

Помогает ли увеличение server.saveinterval, если сервер тормозит во время сохранения?

Это компромисс: реже сохраняете — меньше просадок FPS у игроков во время записи, но больше потенциальных потерь при аварийном завершении между сохранениями. На картах с активным PvP лучше держать интервал коротким и решать просадки другими средствами (SSD, достаточно RAM), а не редким сохранением.

Сервер пишет Saving в консоли, но данные всё равно не сохраняются — в чём дело?

Если строка о сохранении появляется, но файл на диске не обновляется, почти всегда это права доступа или диск, смонтированный в режиме только для чтения после сбоя файловой системы — проверьте mount | grep <точка_монтирования> на флаг ro.

Нужно ли останавливать сервер перед ручным бэкапом папки сохранений?

Не обязательно копировать при полностью остановленном сервере, но безопаснее сначала выполнить save вручную, дождаться завершения записи по логу, и только потом копировать файлы — так вы не заберёте файл в момент частичной записи.