Использование systemd для управления серверами

Сообщения
90
Реакции
126
Помог
3 раз(а)
Заметил что много людей используют самопальные shell скрипты + screen/tmux/nohup для управления серверами и игнорируют штатный системный менеджер, это меня вынудило написать этот небольшой мануал по использованию systemd для управления серверами

Требования: Системный менеджер systemd, отсутствие в системе пользователя hlds, отсутствие жестких/мягких ссылок на /opt/hlds и /home/hlds, умение работать в unix shell, знание базовых unix команд, крайне желательны хоть какие-то познания в systemd

Все shell команды необходимо выполнять от root пользователя
1. Создание systemd сервиса, пользователя и директории для серверов
Bash:
cat << EOF > /etc/systemd/system/[email protected]
[Unit]
Description=%I - Half-Life engine dedicated server
After=network.target

[Service]
User=hlds
Group=hlds
WorkingDirectory=/opt/hlds/%I
Environment=LD_LIBRARY_PATH=/opt/hlds/%I
EnvironmentFile=-/opt/hlds/%I/env
ExecStart=/opt/hlds/%I/hlds_linux $EXTRA_OPTS
Restart=always
Nice=-10

[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
useradd -m hlds
su -c "mkdir srv" - hlds
ln -s /home/hlds/srv /opt/hlds
2. Добавление сервера
Копируем директорию сервера в /opt/hlds/
Указуем по необходимости параметры командной строки в файле /opt/hlds/директория сервера/env
Например для cstrike сервера необходимо как минимум добавить "-game cstrike", а значит содержимое файла должно быть такое: EXTRA_OPTS="-game cstrike"
Если требуется, то исправляем рекурсивно пользователя и группу после копирования файлов: chown -R hlds:hlds /opt/hlds
Запускаем сервер - systemctl start hlds@директория сервера
Добавляем сервер в автозагрузку - systemctl enable hlds@директория сервера
Можно идти играть
3. Управление серверами
Запуск сервера - systemctl start hlds@сервер
Остановка сервера - systemctl stop hlds@сервер
Просмотр статуса сервера - systemctl status hlds@сервер
Просмотр статуса всех серверов - systemctl status hlds@*
Включить автозапуск сервера - systemctl enable hlds@сервер
Выключить автозапуск сервера - systemctl disable hlds@сервер
Просмотр логов сервера - journalctl -u hlds@сервер
Более детально смотрите в документации по systemd
При выполнении вышеперечисленных команд необходимо заменить "сервер" на имя сервера над которым вы хотите совершить действие, имя сервера соответствует имени директории сервера в /opt/hlds
 
Последнее редактирование:
Сообщения
90
Реакции
126
Помог
3 раз(а)
Minni, нечем, у разного ПО есть свое предназначение, данное ПО не предназначено для управления сервисами
 
Сообщения
2,491
Реакции
2,795
Помог
61 раз(а)
Наконец то единомишленик. Только у такого подхода две проблемы которые решаемы
1. Невозможность чекнуть доступен ли сервер. Бывает процесс висит, а сервер висит
2. Консоль сервера только РКОН
 
Сообщения
90
Реакции
126
Помог
3 раз(а)
fantom, не кто не мешает создать скрипт для проверки доступности сервера test -n "$(printf "\xff\xff\xff\xffTSource Engine Query" | netcat -4uq 1 IP PORT 2>/dev/null)", а второе ИМХО дело привычки
P.S щас глянул документацию, можно добавить в systemctl status информацию о доступности сервера при помощи systemd-notify, но это необходимо создавать новый сервис, который будет опрашивать сервера и вызывать sd_notify/systemd-notify, проще отдельный скрипт сделать и вызывать когда нужно
 
Последнее редактирование:
Сообщения
90
Реакции
126
Помог
3 раз(а)
Ради интереса таки сделал изменение статуса сервисов через notify сокет
Выглядеть это в systemctl status будет так:
Status: "127.0.0.1:27015 0/32 0/0 mapname 0 / 0 cstrike hostname"
Формат используется quakestat'овский:
ADDRESS PLAYERS MAP RESPONSE TIME NAME
Если сервер не отвечает, то:
Установка:
Необходимо установить quakestat(пакет qstat в большинстве дистрибутивов)
Создать файл /etc/systemd/system/systemd-qstat-notifyd.service с содержимим:
Bash:
[Unit]
Description="systemd-qstat-notifyd"

[Service]
Restart=always
ExecStart=/bin/sh -c 'while true; do PIDS=$(pidof hlds_linux); for pid in $PIDS; do listen=$(ss -lp4un | grep "pid=$pid" | awk \'{print $4}\'); ip=$(echo "$listen" | cut -d: -f1); test "q$ip" = "q*" && ip="127.0.0.1"; port=$(echo "$listen" | cut -d: -f2); response=$(quakestat -a2s $ip:$port | tail -1); NOTIFY_SOCKET=/run/systemd/notify systemd-notify --pid="$pid" --status="$response"; done; sleep 1; done'

[Install]
WantedBy=multi-user.target
Добавить в файл /etc/systemd/system/[email protected] после Nice=-10(на новой строке): NotifyAccess=all
И выполнить:
Bash:
systemctl daemon-reload
systemctl start systemd-qstat-notifyd
systemctl enable systemd-qstat-notifyd
 
Последнее редактирование:

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу