Как запланировать мягкий перезапуск сервера Valheim
Плановый перезапуск должен сначала завершить сервер с сохранением мира, затем снова запустить процесс. Начните с уже работающей и проверенной службы, например valheim.service. Расписание не исправляет ошибочный запуск, нехватку памяти или сбой загрузки мира.
Выберите окно обслуживания и часовой пояс
- Согласуйте с игроками подходящее окно по реальному времени посещений; универсального обязательного ежедневного интервала нет.
- Проверьте часовой пояс машины и планировщика. Контейнер или панель могут использовать другой пояс; сохраните время окна также в UTC.
- Выберите один механизм перезапуска и проверьте, не действует ли уже другой timer, cron или расписание панели.
- Разведите обслуживание, обновление и резервное копирование так, чтобы они не выполнялись одновременно.
Предупредите группу привычным согласованным способом либо выберите заведомо согласованное тихое окно. Само расписание не доказывает отсутствие игроков. Скрипт отправки сообщений, проверка онлайн-игроков и внешние интеграции в этот гайд не входят.
До включения расписания проверьте мягкую остановку
Для описанного Linux-сценария служба должна отправлять SIGINT, аналог Ctrl+C. В [Service] проверьте KillSignal=SIGINT и достаточный TimeoutStopSec. Значение 120 секунд в источнике — пример, а не гарантия для любого мира. Официальная документация systemd отдельно задаёт RestartKillSignal: если он установлен, при restart используется он; если отсутствует, применяется KillSignal.
Проверьте фактически загруженную службу и скрипт запуска. Запуск сервера через exec в переднем плане облегчает отслеживание основного процесса. При стандартном KillMode=control-group сигнал относится ко всей группе: отсутствие exec само по себе ещё не доказывает потерю сигнала. После таймаута systemd по умолчанию может перейти к SIGKILL, который не заменяет сохранение.
- Сделайте полную резервную копию используемых сохранений до изменения автоматизации. Для мира 1.0 не ограничивайтесь старой парой .db/.fwl.
- В согласованное окно выполните ручную проверку restart службы, например sudo systemctl restart valheim.service.
- Прочитайте journalctl -u valheim -n 100 --no-pager: найдите запись сохранения и нормального завершения до нового запуска.
- Проверьте загрузку правильного мира и сетевую готовность нового запуска. Одного состояния active недостаточно. Если были таймаут, принудительное завершение или ошибка запуска, сначала устраните причину.
Вариант 1: systemd timer
Ниже пример ежедневного окна в 05:00 по часовому поясу планировщика. Подставьте согласованное время и реальное имя своей службы. Каждая строка таблицы относится к указанному файлу; переносы внутри ячеек — отдельные строки конфигурации.
| Файл | Содержимое |
|---|---|
| /etc/systemd/system/valheim-restart.service | [Unit] Description=Restart the Valheim server [Service] Type=oneshot ExecStart=/usr/bin/systemctl restart valheim.service |
| /etc/systemd/system/valheim-restart.timer | [Unit] Description=Scheduled Valheim restart [Timer] OnCalendar=*-*-* 05:00:00 Persistent=false [Install] WantedBy=timers.target |
- После сохранения unit-файлов перечитайте их: sudo systemctl daemon-reload.
- Проверьте календарное выражение: systemd-analyze calendar "*-*-* 05:00:00". Сверьте рассчитанное время со своим окном.
- Включите timer: sudo systemctl enable --now valheim-restart.timer.
- Посмотрите systemctl list-timers 'valheim*': проверьте следующий запуск, а после наступления окна — журнал задачи и сервера.
Persistent=false не запускает пропущенное обслуживание сразу после позднего включения машины. Для задачи перезапуска это помогает не переносить тихое ночное окно на вечер. Это отличается от желаемого поведения некоторых резервных копий; не копируйте Persistent=true из backup-timer автоматически.
Вариант 2: cron вместо timer
Если уже используете cron, пример строки в /etc/cron.d/valheim-restart: 0 5 * * * root /usr/bin/systemctl restart valheim.service. Это те же 05:00 в часовом поясе cron машины. Поле root требуется для формата /etc/cron.d; в личном crontab поля пользователя нет. Не включайте одновременно этот пример и timer для одной задачи.
Проверьте результат первого планового запуска
- Сопоставьте реальное время запуска с выбранным часовым поясом и ожидаемым окном.
- Проверьте последовательность: сохранение при остановке, завершение, новый процесс, загрузка нужного мира, готовность подключения.
- Если сервер не вернулся, читайте первую ошибку нового запуска: завершённый shutdown не доказывает успешный start.
- При Crossplay проверьте актуальный join code после запуска; прежний код может измениться.
При ServerManager и других модах учитывайте их дополнительные требования к завершению. Например, опубликованный гайд ServerManager требует подтверждённого checkpoint с pending=0: одна строка World saved не доказывает получение каждого последнего действия клиента. Не приравнивайте успешный restart к гарантии отсутствия потерь прогресса.
Обновления и резервные копии — отдельные операции
Не добавляйте автоматическое обновление модифицированного набора в обычный restart. Сначала отдельно подтвердите поддержку версии игры модами и подготовьте резервную копию. Даже для vanilla решение об обновлении требует согласования версий клиентов и сервера; перезапуск сам по себе не обязан обновлять файлы игры.
Не копируйте живой каталог во время записи сохранения. Несколько минут после старта не гарантируют согласованность: сервер может снова сохранять мир. Для надёжной копии используйте проверенную процедуру при остановленном сервере либо механизм получения полного согласованного набора файлов. Сохраняйте весь актуальный каталог мира, включая путь, выбранный через -savedir, и отдельную копию вне машины.
Если сервер уже работает в контейнере
Не переносите примерные значения сторонней статьи на любой образ. В сохранённом README community-valheim-tools отдельно заданы RESTART_CRON, RESTART_IF_IDLE, UPDATE_CRON и UPDATE_IF_IDLE, а TZ определяет пояс контейнера. Пустая строка отключает соответствующее cron-расписание. Проверьте документацию именно используемого образа; RESTART_IF_IDLE не является универсальной функцией systemd timer.
Гайд был полезен?