Vladimir
21.07.2017
16:09:46
то есть нужно чтобы рестарт не убил рабочую копию демона
Vladislav
21.07.2017
16:09:47
чтобы пока работает (старый) - был ок, упал - не ок, имхо так правильее
Vladimir
21.07.2017
16:11:21
чтобы пока работает (старый) - был ок, упал - не ок, имхо так правильее
ок, давай формально распишем:
1. Есть демон, он работает нормально
2. Демон умеет reload по SIGUSR1 и поэтому reload трогать нельзя
3. Если происходит рестарт нужно проверить валидность конфига (допустим демон умеет -t) и если конфиг не валиден прервать рестарт с exit code != 0 (то есть сфейлится). При этом нельзя убивать рабочую копию демона
4. После этого status должен показывать что все ОК
5. Рестарт должен корректно отработать как только конфиг починится - убить старый демон и запустить новый
6. Это не должно подменять systemctl, как либо патчить systemd и т.п.
Vladislav
21.07.2017
16:12:28
окей. кстати можно KillMode=none заюзать + SendSIGKILL=no, группа не помрет
Google
Vladimir
21.07.2017
16:12:40
ты не сможешь средствами системд остановить старый демон
Vladislav
21.07.2017
16:12:57
с чего бы?
Vladimir
21.07.2017
16:13:01
Vladislav
21.07.2017
16:13:36
хочешь сказать, что ExecStop не будет выполняться?
Vladimir
21.07.2017
16:14:04
при этом демон продолжит работать
но больше не будет управляться системдшкой
то есть статус будет говорить stopped
systemctl stop будет говорить "already stopped"
когда конфиг починится системд запустит вторую копию (если это возможно)
и это в некоторых случаях может иметь катастрофические последствия
Google
Vladimir
21.07.2017
16:15:49
я знаю пару рабочих решений но со внешними скриптамио по сути
я не знаю ни одного рабочего решения работающего в рамках одного юнита системд
Vladislav
21.07.2017
16:16:48
запускам враппер, который форкается в sleep c ожиданием SIGUSR1, кормим его пид системд, отключаем посыл кила группе, меняем терм сигнал на usr1 в системд, в форке по usr1 извещаем паренту о требовании смерти, в паренте чекаем конфиг, если все ок, убиваем форк, умираем сами, системд перезапустит все остальное
если конфиг не ок, игнорим сигнал, работаем форком дальше
Vladimir
21.07.2017
16:17:29
ты проверь решение сначала
Vladislav
21.07.2017
16:17:37
должно работать в рамках одного юнита + скрипт, хоть на баше, хоть на си и т.д.
Vladimir
21.07.2017
16:17:46
ну ты проверь что решение работает
у systemd есть особенность
Vladislav
21.07.2017
16:17:57
Vladimir
21.07.2017
16:18:03
все запущенное дерево будет в одной cgroup'е
если после стопа остаются пиды после таймаута, они получат KillSignal
Sergey
21.07.2017
16:18:30
Vladimir
21.07.2017
16:18:33
поэтому если оно форкается - то форк тоже будет в группе и получит сигнал
с двумя юнитами такое сработает
Vladislav
21.07.2017
16:18:58
Vladimir
21.07.2017
16:19:01
точнее почти сработает
Vladislav
21.07.2017
16:19:13
чушь
Vladimir
21.07.2017
16:19:19
Sergey
21.07.2017
16:19:25
Google
Vladimir
21.07.2017
16:19:28
не чушь, потому что я проверял
даже более того - мне эта фича нравится в нем
Vladislav
21.07.2017
16:19:48
если процес форкнется с новым sid/gid и репарент сделает, то он будет совершенно другим
Vladimir
21.07.2017
16:19:58
Vladislav
21.07.2017
16:20:06
Vladimir
21.07.2017
16:20:07
нужно чтобы у тебя были права выйти из группы
Vladislav
21.07.2017
16:20:09
и группами
Vladimir
21.07.2017
16:20:44
Vladislav
21.07.2017
16:20:46
запусать враппер с нужными правами, из него запускать демона с нужными ему, если оно само не умеет
Vladimir
21.07.2017
16:21:02
тогда тебе нужно сделать новый юнит, работающий от рута, который будет делать весь реальный process management
следить кто в какой группе
и т.п.
плюс этот скрипт должен будет висеть и не дохнуть
т.к. если он сдохнет то эти процессы будут бесхозными, системд это перезапустит и будет пипец
то есть тебе надо будет писать stateful систему менеджмента процессов, устойчивую к падению управляюещго процесса
когда ты это напишешь тебе надо будет ответить на вопрос зачем тебе системд, если самую сложную часть инита ты уже переписал?
Vladislav
21.07.2017
16:22:52
угу, механика получается сложноватое с fsm-like обработкой состояний )
Vladimir
21.07.2017
16:23:32
так как в таком состоянии тебе еще придется отрабатывать зависимости между процессами и пр.
Vladislav
21.07.2017
16:23:38
как зачем? такое демон один
Google
Vladislav
21.07.2017
16:23:49
если все такие - действительно, зачем тогда systemd
Vladimir
21.07.2017
16:23:54
с учетом зависимостей и пр.
вероятно умеющий парсить зависимости )
Vladislav
21.07.2017
16:24:17
не весь. и не полностью. чуть чуть костылей для одного конкретного
Vladimir
21.07.2017
16:24:32
на практике
тебе предлагаю
Vladislav
21.07.2017
16:24:39
ой всё, это бесконечная игра в "а теперь давай еще условие придумаю" )
Vladimir
21.07.2017
16:24:42
как автору идеи )
я тебе просто отвечаю на вопросы как реально работает системд
и какие косяки полезут и пункты будут нарушены если сделать тупой скрипт
Vladislav
21.07.2017
16:25:28
возьму какогонить демона на ненужной тачке с systemd, и попробую сделать, чтобы он жил при рестарте с битым конфигом
Vladimir
21.07.2017
16:25:47
если чо
Vladislav
21.07.2017
16:26:14
про внешние скрипты я изначально говорил
допюнит не особо нужен
Vladimir
21.07.2017
16:26:30
@themiron так вот, вторая проблема в системд с которой я столкнулся, что если у тебя есть демон и ты почему-то решил stdout писать в лог, то у тебя строки будут биться на 2048 байте
что очень хорошо когда у тебя там json :)
Google
Vladimir
21.07.2017
16:26:45
например
Vladislav
21.07.2017
16:27:03
Vladimir
21.07.2017
16:27:04
решения нет
Vladislav
21.07.2017
16:27:24
won't fix? )
Vladimir
21.07.2017
16:27:29
явная бага
я над хрычем издеваюсь, потому что копию баги завел через редхатовый платиновый саппорт
Vladislav
21.07.2017
16:27:55
как вариант - поправить самому и засабмитить в апстрим
Vladimir
21.07.2017
16:27:57
уже 4-ый месяц мне отвечают там )
я из спортивного интереса (чтоб троллить хрыча) не хочу
Vladislav
21.07.2017
16:28:37
:) как у вас все затейливо
Vladimir
21.07.2017
16:28:53
Vladislav
21.07.2017
16:29:25
и раз уш пошла такая пьянка, то лично я бы пофиксил/изменил systemd под задачу, чем костылять костыли.
Vladimir
21.07.2017
16:29:50
Vladislav
21.07.2017
16:30:10
по сути, все, что нужно - PreStop с возмодностью сфейлиться
Vladimir
21.07.2017
16:30:32
пока они не обсудят патч не примут
Vladislav
21.07.2017
16:31:34
trade off между - вести свое периодически синкаясь vs потратить время на оформление и отправку
Эта группа больше не существует