systemd, screen и tmux для игровых процессов
Запустил сервер прямо в SSH-сессии, закрыл терминал — и процесс умер вместе с сессией. Знакомая ситуация для тех, кто первый раз поднимает Rust, Minecraft или CS2 на VPS. Есть три рабочих способа держать игровой процесс в фоне: screen, tmux и systemd. У каждого свои плюсы, и часто их используют не по отдельности, а вместе — разберём, как и когда.
Содержание
Почему процесс умирает при закрытии SSH
Когда вы запускаете ./start.sh или java -jar server.jar прямо в терминале, процесс привязан к вашей SSH-сессии — технически он становится дочерним процессом шелла и получает сигнал SIGHUP, как только сессия завершается. Обходной путь через nohup ./start.sh & работает, но у него есть неприятные ограничения: вы не увидите консоль сервера вживую, не сможете набрать команду save-all или stop в стандартный ввод процесса, а вывод придётся вычитывать из файла логов через tail -f nohup.out. Для разовой задачи сгодится, но для постоянной работы сервера — не вариант.
Отсюда и растут три подхода: терминальный мультиплексор (screen или tmux), который держит виртуальную сессию живой независимо от вашего подключения, и системный менеджер процессов (systemd), который управляет процессом на уровне ОС.
screen: самый простой вход в тему
screen — старый и почти всегда предустановленный инструмент (если нет — apt install screen или yum install screen). Логика простая: вы создаёте именованную сессию, запускаете в ней сервер, отсоединяетесь — сессия продолжает жить в фоне, а при следующем подключении вы возвращаетесь в неё и видите ровно ту же консоль, какой её оставили.
screen -S rust-server
cd /home/steam/rust
./RustDedicated -batchmode +server.port 28015
Отсоединиться от сессии, не убивая процесс: Ctrl+A, затем D. Вернуться позже:
screen -r rust-server
Посмотреть список активных сессий:
screen -ls
Если сессия вдруг оказалась "attached" в другом месте (например, соединение оборвалось некорректно), подключиться принудительно:
screen -d -r rust-server
Плюс screen — вы буквально видите живую консоль сервера: логи чанков, сообщения игроков, RCON-вывод, предупреждения о крашах. Минус — если сервер упадёт (например, из-за нехватки памяти или бага мода), screen сам его не перезапустит: сессия останется открытой, но пустой, а игроки будут стучаться в закрытый порт, пока вы не заметите проблему и не зайдёте руками.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверtmux: тот же принцип, но гибче
tmux решает ту же задачу, что и screen, но даёт более удобную работу с несколькими окнами и панелями внутри одной сессии — полезно, если на одном VPS крутится сразу несколько игровых серверов или вы хотите держать рядом консоль сервера и, скажем, htop.
tmux new -s ark-server
cd /home/ark/server
./ShooterGameServer TheIsland?listen -server -log
Отсоединиться: Ctrl+B, затем D. Вернуться:
tmux attach -t ark-server
Список сессий:
tmux ls
Разделить окно на панели можно прямо внутри сессии: Ctrl+B % — вертикальный сплит, Ctrl+B " — горизонтальный. Удобно, когда нужно одновременно смотреть консоль сервера и, например, вывод journalctl или мониторинг нагрузки — подробнее про это в статье про мониторинг TPS и лагов.
По сути выбор между screen и tmux — дело привычки: screen проще и стоит почти везде из коробки, tmux функциональнее, но иногда требует отдельной установки. Автоперезапуска при падении процесса ни тот ни другой не даёт — это ограничение общее для обоих мультиплексоров.
systemd: автозапуск и автоперезапуск на уровне ОС
systemd — стандартный менеджер сервисов в современных дистрибутивах (Ubuntu, Debian, CentOS/AlmaLinux). Вместо ручного запуска в терминале вы описываете процесс как unit-файл, и дальше система сама следит за ним: запускает при загрузке хоста, перезапускает при падении, пишет вывод в единый журнал.
Минимальный unit-файл для игрового сервера, например /etc/systemd/system/rust-server.service:
[Unit]
Description=Rust Dedicated Server
After=network.target
[Service]
Type=simple
User=steam
WorkingDirectory=/home/steam/rust
ExecStart=/home/steam/rust/RustDedicated -batchmode +server.port 28015
Restart=always
RestartSec=10
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target
Ключевая строка — Restart=always: если процесс упадёт (краш, OOM, кто-то случайно убил его через kill), systemd подождёт RestartSec секунд и поднимет сервер заново без вашего участия. Это то, чего screen и tmux не умеют сами по себе.
Применить и запустить:
systemctl daemon-reload
systemctl enable rust-server
systemctl start rust-server
Статус и логи:
systemctl status rust-server
journalctl -u rust-server -f
Полный разбор автозапуска через systemd, флагов Restart=, работы с правами пользователя и типичных грабель (например, если сервер демонизируется сам и Type=simple работает некорректно) — в отдельной статье про автозапуск игрового сервера при перезагрузке хоста. Здесь — только сравнение подходов, поэтому не дублируем детали.
Минус systemd — вы не видите живую консоль сервера так же удобно, как в screen или tmux. journalctl -u rust-server -f покажет поток логов, но набрать интерактивную команду в стандартный ввод процесса (например, RCON-команду прямо в консоли Minecraft-сервера без плагина) уже не получится — процесс запущен не в интерактивном терминале, а как системный сервис.
Сравнение подходов
| Критерий | screen | tmux | systemd |
|---|---|---|---|
| Автозапуск при загрузке хоста | нет | нет | да |
| Автоперезапуск при падении | нет | нет | да (Restart=always) |
| Живая интерактивная консоль | да | да | ограниченно (только вывод логов) |
| Несколько окон/панелей в сессии | нет | да | не применимо |
| Порог входа | низкий | средний | средний-высокий |
| Централизованные логи | нет (только вывод в терминал) | нет | да (journalctl) |
Если коротко: screen/tmux — про удобство ручного управления и живую консоль, systemd — про надёжность и автоматику. Ни один из вариантов не покрывает всё сразу, и это нормально.
Комбинированный подход: systemd + screen или tmux
На практике многие держат основной запуск через systemd ради надёжности — если хост перезагрузится или сервер упадёт ночью, он поднимется сам, — а для ручного вмешательства заходят через screen или tmux, когда нужно ввести команду прямо в консоль сервера (например, save-all на Minecraft перед бэкапом или ручной RCON-вызов на Rust).
Технически совместить оба варианта можно так: вместо прямого запуска бинарника через ExecStart, systemd запускает screen-сессию с сервером внутри:
ExecStart=/usr/bin/screen -DmS rust-server /home/steam/rust/RustDedicated -batchmode +server.port 28015
Флаг -DmS создаёт detached-сессию сразу в фоне. После старта сервиса можно зайти в ту же сессию руками:
screen -r rust-server
и увидеть живую консоль — при этом systemd продолжает следить за процессом и перезапустит его при падении. Нюанс: если вы наберёте в screen-сессии команду, которая останавливает сервер изнутри (например, stop в консоли Minecraft), это будет выглядеть для systemd как штатное завершение процесса, и он тут же попытается перезапустить его согласно Restart=. Чтобы временно остановить сервер для обслуживания, правильнее сначала сделать systemctl stop rust-server, а не гасить процесс изнутри его собственной консоли.
Такая связка не единственно верная — некоторые предпочитают более "тяжёлые" решения вроде tmux с автоматическим логированием панелей или отдельные обвязки для RCON, но для большинства связок это оверинжиниринг. Если сервер регулярно падает и вы не понимаете почему, разумнее сначала разобраться в причине через логи и краш-репорты, а не полагаться только на автоперезапуск — он лечит симптом, а не причину, и на утро вы рискуете получить сервер, который перезапускался десять раз за ночь с потерей прогресса игроков каждый раз.
Нужен игровой сервер?
MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.
Создать серверЧастые вопросы
Что выбрать новичку — screen или tmux?
Если инструмент не принципиален, начните со screen: он почти всегда уже установлен и синтаксис проще. Переходите на tmux, когда понадобятся несколько панелей в одной сессии.
Обязательно ли использовать systemd?
Нет, но без него сервер не переживёт перезагрузку хоста и не восстановится сам после краша. Для тестового или временного сервера screen/tmux достаточно, для постоянного продакшена лучше добавить systemd.
Можно ли использовать systemd без screen/tmux вообще?
Да, это самый частый вариант для стабильных серверов — вывод смотрите через journalctl -u имя-сервиса -f, а для интерактивных команд используете RCON-клиент или плагин, а не прямой ввод в консоль.
Что будет с процессом screen/tmux, если я просто закрою терминал, не отсоединяясь явно?
Ничего страшного — сессия screen/tmux всё равно продолжит жить в фоне на сервере, отсоединение через Ctrl+A D / Ctrl+B D нужно скорее для порядка и чтобы не забыть, какие сессии у вас открыты.
systemd перезапускает сервер слишком часто — как замедлить?
Увеличьте RestartSec (например, до 30-60 секунд) и добавьте StartLimitIntervalSec/StartLimitBurst в секцию [Unit], чтобы systemd прекращал попытки после нескольких неудачных стартов подряд, а не зацикливался бесконечно.