Свой сервер

Сервер KF2 на Linux: пользовательская служба systemd (unit-файл)

Страница пересказывает руководство сообщества о том, как управлять выделенным сервером Killing Floor 2 в Linux через пользовательскую службу systemd. Автор писал его на Gentoo Hardened, но на других дистрибутивах с systemd всё должно быть похоже. Он подчёркивает, что гарантий нет: читайте и понимайте каждую команду перед запуском. Установка самого сервера: сервер KF2 через SteamCMD.

Что нужно заранее

  • Дистрибутив с systemd.
  • Отдельный непривилегированный пользователь для сервера (не root и желательно не в группе wheel: это лишний риск).
  • Установленные SteamCMD и выделенный сервер KF2, при этом бинарник должен запускаться вручную без ошибок, например: exec /path/to/killingfloor2_dedicated_server/Binaries/Win64/KFGameSteamServer.bin.x86_64.
  • Заранее настроенные файрвол и порты (в руководстве не рассматриваются).
  • Один раз root-доступ для команды linger.

Обозначения: команды с $ выполняются от пользователя сервера, с # от root; префикс при вводе убирайте.

Примеры имён

Пользователь steamserver, домашняя папка /home/steamserver, unit-файл kf2-server.service в пользовательской папке systemd, SteamCMD в /mnt/server/steam/steamcmd, игра в /mnt/server/steam/games/killingfloor2. Меняйте под свою систему.

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

От пользователя сервера создайте каталог и файл:

$ mkdir -p ~/.config/systemd/user
$ touch ~/.config/systemd/user/kf2-server.service

Содержимое файла:

[Unit]
Description=Killing Floor 2 Dedicated Server

[Service]
Type=simple
ExecStart=/mnt/server/steam/games/killingfloor2/Binaries/Win64/KFGameSteamServer.bin.x86_64
Restart=on-failure
TimeoutStopSec=30
KillSignal=SIGINT
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
  • Description это свободный текст.
  • ExecStart должен быть полным путём к бинарнику, без exec и лишнего синтаксиса.
  • Restart=on-failure перезапускает сервер после сбоя; сигнал остановки SIGINT (Ctrl-C), на завершение даётся 30 секунд.

Первый запуск как службы

  1. Linger. От root один раз выполните # loginctl enable-linger steamserver. Тогда процессы пользователя переживают закрытие оболочки, и screen не нужен.
  2. Не используйте su. Откройте сессию пользователя командой $ machinectl shell --uid steamserver (из-под пользователя группы wheel) либо войдите через TTY или рабочий стол. Через su systemd сообщит, что не к чему подключаться. Для управления службой при каждом входе придётся использовать machinectl; можно сделать алиас.
  3. Перезагрузка списка. $ systemctl --user daemon-reload. Делайте это после любого изменения unit-файла, иначе продолжит использоваться старая версия, и отладка займёт часы.
  4. Запуск. $ systemctl --user start kf2-server.service. Оболочка не должна ничего выводить; при ошибках смотрите journalctl --user -u kf2-server.service.
  5. Проверка. $ systemctl --user status kf2-server.service. Нормальный статус показывает «active (running)», главный PID и строки журнала сервера, например параметры DevOnline. После этого попробуйте подключиться к серверу в игре.

Запуск при загрузке

$ systemctl --user enable kf2-server.service или включение и запуск одной командой enable --now. Автор отмечает безобидное предупреждение о том, что multi-user.target для пользовательского экземпляра не существует; перезагрузитесь и убедитесь, что всё стартует как задумано.

Благодарности

Автор благодарит помощников из сообществ Gentoo и TripWire и ссылается на документацию systemd и устаревший пример unit-файла из времён, когда бинарника сервера KF2 для Linux ещё не было. Текст распространяется без ограничений.

Вопросы и ответы

Зачем systemd вместо screen?
Пользовательская служба с включённым linger продолжает работать после выхода из сессии, перезапускается при сбое и стартует при загрузке, так что screen не нужен.
Почему нельзя использовать su для входа под пользователем сервера?
Без сессии входа systemctl --user не к чему подключаться; используйте machinectl shell --uid <пользователь> или войдите через TTY или рабочий стол.
Как корректно остановить сервер?
Unit отправляет SIGINT (Ctrl-C) как сигнал остановки, с тайм-аутом остановки 30 секунд.