LINUX.ORG.RU
ФорумGames

Quake II Dedicated Server сопряжение перезапуска с systemd

 , ,


1

1

Как известно, сервер для Quake II нуждается в периодическом рестарте:

One thing to keep in mind is that the server must be restarted at least every 49 days, because the Quake II network protocol represents the interal time as a 32 bit integer and after 49 days that integer overflows, leading to all kinds of trouble.

This problem has always existed in Quake II and is not fixable (at least not without breaking compatibility with the existing network protocol), but back in Win9x days this was less of a problem because Windows crashed frequently anyways and Win9x had the same bug and crashed after 49 days or so...

Как это можно сделать красиво?

Я сделал через crontab, вроде такого:

0 0 1 * * /usr/bin/systemctl restart q2ded

Но интересует, существуют ли более элегантные решения?

ENV: CentOS 7, systemd 219.

q2ded.service:

[Unit]
Description=Quake II Server
Wants=network-online.target
After=network.target network-online.target

[Service]
User=opc
WorkingDirectory=/srv/quake2
ExecStart=/usr/bin/stdbuf -i0 -o0 -e0 /srv/quake2/q2ded
StandardOutput=journal
StandardError=journal
SyslogIdentifier=q2ded
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
★★★★★

Последнее исправление: EXL (всего исправлений: 1)

Отдельный таймер+сервис с Type=oneshot, в котором написано systemctl try-restart $MAIN_UNIT_NAME.

элегантно

Можно привязать жизненный цикл таймера к жизненному циклу основного юнита (через Wants= и PartOf=).

Один юнит, одно действие. Делать из systemd weird machine не нужно.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 2)
Ответ на: комментарий от intelfx

Ага, то есть аналогичное решение верно?

https://gist.github.com/goyalankit/e8223915c382b98cfe99fff57bbc52dc

Юнит сервиса+таймера можно назвать как-нибудь типа q2ded-restart, чтобы понимать для чего все это служит.

Один юнит, одно действие. Делать из systemd weird machine не нужно.

Да, но здесь можно и с другой стороны посмотреть – кучка файлов (сервисы, таймер) может несколько запутать, в отличие от отдельной «всеобъемлющей» сущности, в которой имеется все особенности сервиса.

EXL ★★★★★
() автор топика
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от intelfx

Такие ещё вопросики.

  1. Type=oneshot обязательно указывать? Он вроде как по умолчанию идёт?
  2. Для отключения буферизации есть ли более элегантное решение, чем /usr/bin/stdbuf -i0 -o0 -e0?
EXL ★★★★★
() автор топика
Ответ на: комментарий от EXL

Type=oneshot обязательно указывать?

Да.

Он вроде как по умолчанию идёт?

Нет, man systemd.service.

Для отключения буферизации есть ли более элегантное решение, чем /usr/bin/stdbuf -i0 -o0 -e0?

Для отключения буферизации где? В какой ситуации тебе потребовалось её отключать?

intelfx ★★★★★
()
Ответ на: комментарий от intelfx

Для отключения буферизации где? В какой ситуации тебе потребовалось её отключать?

Буферизации stdout. Чтобы видеть нормальный лог в journalctl от бинаря q2ded, который льет всё в stdout. Без магии setbuf я вижу только огрызки лога и то лишь когда останавливаю сервис.

EXL ★★★★★
() автор топика
Ответ на: комментарий от EXL

Ага. Я это к тому, что хотел посоветовать PYTHONUNBUFFERED, но насколько понимаю, это не питон.

stdbuf лезет в настройки буферизации на уровне stdio в libc клиентской программы. Делается это через LD_PRELOAD, то есть грязный хак (потому что по-другому нельзя). Таких хаков в systemd нет.

intelfx ★★★★★
()
Последнее исправление: intelfx (всего исправлений: 1)
Ответ на: комментарий от intelfx

Ага, про PYTHONUNBUFFERED знаю, сталкивался. Там ещё флажок -u есть у интерпретатора, если не нравится переменная окружения.

Но тут не Python, увы.

P.S. С Java тоже проблем таких не наблюдалось.

В общем, спасибо! Возьму вариант со связкой q2ded-restart.service + q2ded-restart.timer на вооружение.

EXL ★★★★★
() автор топика
Ответ на: комментарий от intelfx

И еще такой вопрос, чтобы отдельную тему по пустяку не создавать.

Откуда-то из дебрей документации по Java/Spring Boot стеку, их гайдов или примеров, стянул себе вот такой вот unit, который везде использую:

[Unit]
Description=Spring Boot Service
Wants=network-online.target
After=network.target network-online.target postgresql.service

[Service]
User=opc
WorkingDirectory=/srv/
ExecStart=/usr/bin/java -jar /srv/spring-boot-service-1.0.0.jar
StandardOutput=journal
StandardError=journal
SyslogIdentifier=spring-boot
SuccessExitStatus=143
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

Работает оно везде уже много лет без нареканий, но немного смущают вот эти строки:

Wants=network-online.target
After=network.target network-online.target postgresql.service

Нормально ли так делать? Действительно ли сервис будет поднят после network-online / postgresql?

EXL ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.