Сервер 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 секунд.
Первый запуск как службы
- Linger. От root один раз выполните
# loginctl enable-linger steamserver. Тогда процессы пользователя переживают закрытие оболочки, иscreenне нужен. - Не используйте su. Откройте сессию пользователя командой
$ machinectl shell --uid steamserver(из-под пользователя группы wheel) либо войдите через TTY или рабочий стол. Черезsusystemd сообщит, что не к чему подключаться. Для управления службой при каждом входе придётся использовать machinectl; можно сделать алиас. - Перезагрузка списка.
$ systemctl --user daemon-reload. Делайте это после любого изменения unit-файла, иначе продолжит использоваться старая версия, и отладка займёт часы. - Запуск.
$ systemctl --user start kf2-server.service. Оболочка не должна ничего выводить; при ошибках смотритеjournalctl --user -u kf2-server.service. - Проверка.
$ 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 секунд.