LINUX.ORG.RU
ФорумTalks

[хроники пикирующего пингвина] sysvinit + service supervision, doing it right


0

1

Ещё раз: я не защищаю systemd, я критикую sysvinit, причём исключительно по части service supervision, остальное меня совершенно устраивает.

(c) GotF

А теперь, мужики, давайте подумаем. Вводная:

  • К init-у репарентятся все процессы с помершим родителем.
  • init для всего этого счастья ловит SIGCHLD-ы, когда они дохнут.
  • если померший процесс был запущен init-ом из правила inittab, он перезапускается в случае необходимости. В ином случае не происходит ничего.

Что нам мешает добавить гибкости в эту схему? init управляется через /dev/initctl. Мы можем слегка доработать его управление и получить возможность «ставить на контроль» произвольные PID-ы.

Следующая команда будет ставить указанный pid на контроль:

/sbin/telinit --waitpid $pid --run some command
Когда pid помрёт, init запустит 'some command'.

Собственно, всё. Это был механизм.

Теперь use case, для чего нам это нужно. Возьмём обычный rc.d-подобный метод запуска демонов. Напомню вам, что там происходит:

  • rc запускает нужный демон.
  • демон записывает в /var/run/blabla.pid свой pid.
  • пока содержимое /var/run/blabla.pid соответствует живому pid-у, демон считается запущенным.

Итак, вам нужен service supervision. По сути, всё, что вам нужно знать, это когда pid умрёт. Что мы делаем:

  • rc запускает демон blabla.
  • демон записывает в /var/run/blabla.pid свой pid.
  • rc выполняет команду /sbin/telinit --waitpid `cat /var/run/blabla.pid` --run /etc/rc.died blabla
  • когда процесс умирает (или если он уже мертв на момент попадания команды в init), init вызывает команду /etc/rc.died blabla. Если демон blabla всё еще нужен (не помечен как выключенный), он перезапускается.

Мысли? Мнения? Критика?

Ответ на: комментарий от netcat

Лучше новый. Старый будет deprecated и т.п. Скрывать наверное лучше поименно. lxpanelctl panel имяпанели setvisible 0

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

$ cat /proc/1183/cmdline udisks-daemon: not polling any devices

Да не уж то systemd? Не реально бред какой-то - читай спеку на procfs

Учитывая, что твой бред с темой треда не согласуется никак вообще

Ты пытаешься пихнуть в rc то что там уже давно присутствует, чем сильно напоминаешь одного поциента заскучавшего по свинцовым примочкам внутрицеребрально.

iBliss
()
Ответ на: комментарий от Manhunt

придется делать автоматическую перезапускалку (watchdog).

rc и есть унифицированный watchdog.

iBliss
()
Ответ на: комментарий от netcat

Нет, даже не так. Вот так:
lxpanelctl panel имяпанели visible false — выключает
lxpanelctl panel имяпанели visible true — включает
lxpanelctl panel имяпанели visible toggle — переключает

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

Да не уж то systemd?

Казалось бы, при чем тут systemd.

Не реально бред какой-то - читай спеку на procfs

Это не бред, это так устроен линукс. С разморозкой.

Ты пытаешься пихнуть в rc то что там уже давно присутствует

Друг мой, вы больны. Я веду речь про init.

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

Одно дело поставить вочдог «на всякий случай», другое дело - когда аппликуха периодически падает и перезапускается им и это в порядке вещей и никаких подвижек не происходит. Как правило, написание вочдога приводит к отсутствию необходимости допиливания программы, а зачем, оно и так работает, а что падает - так вочдог справляется :)

В нормальной ситуации в боевой системе не должно быть никаких планомерных профилактических перезапусков и старт нужных аппликух опционально прописан в скриптах запуска сервера.

Deleted
()

Где можно подписаться? Где кнопка +1?

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

Как правило, написание вочдога приводит к отсутствию необходимости допиливания программы

«Разруха не в клозетах, а в головах» (с)

Та же ошибка, которая иногда выражается в падении, может в других ситуациях приводить к зависаниям (включая livelock), к неверным результатам, и просто служить дырой в безопасности. От всего этого вотчдог не страхует. Поэтому, если нужно достичь удовлетворительного качества программы, говорить об «отсутствии необходимости» не приходится.

Назначение ватчдога - быть страховкой от падений, которые по каким-то причинам не успели выявить до введения программы в боевую эксплуатацию. Он не может заменить собой багфикс, принципиально.

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

Одно дело поставить вочдог «на всякий случай»

Вот именно для этого оно и нужно: внезапно что-то упало, инит это что-то перезапускает, сопровождая событие записью в логе, чтобы ответственные лица потом занялись выяснением причин и починкой. Функция вполне уместна, полезна и не делает init комбайном. А проблемы типа

а зачем, оно и так работает, а что падает - так вочдог справляется

должны решаться организационными методами. Программа не должна лишаться каких-то возможностей лишь потому, что их отсутствие способствует самодисциплине администратора, особенно когда оно на самом деле не способствует — один чёрт «временных» костылей понапишут.

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

Pid-файлы появились во времена когда грепнуть /proc было тем ещё гемором, когда ext2 была только планом

ЧИВО????

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

есть respawn а inittab для очень критичных процессов, есть тот-же rc, из которого можно не только запускать что-то, но и следить за этим чем-то.

и зачастую надо ведь не просто перезапускать упавшее, а для начала определить причину падения.

ananas ★★★★★
()

Контроль по пидам - это какой то бред. Где гарантия, что в момент проверки пиду соответствует именно запущенный процесс, а не какой то другой, запущенный через 100500 процессов после падения изначального владельца pid?

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

Контроль по пидам - это какой то бред. Где гарантия, что в момент проверки пиду соответствует именно запущенный процесс, а не какой то другой, запущенный через 100500 процессов после падения изначального владельца pid?

Да-да, за миллисекунду между запуском демона и передачей команды слежения в init, демон успеет сдохнуть, и тот же pid займёт другой процесс. Ты сам-то в это веришь?

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

Мы тут обсуждаем не 'зачем нужен service supervision', а 'как его грамотно реализовать с sysvinit'. По условиям задачи, он зачем-то нужен. См. первый абзац поста.

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

Мы тут обсуждаем не 'зачем нужен service supervision', а 'как его грамотно реализовать с sysvinit'. По условиям задачи, он зачем-то нужен. См. первый абзац поста.

ладно, отбросим в сторону нужность супервайзера, и постоянное дерганье init-а, который будет вынужден следить за процессами.

просто посмотри, как обычно запускаются те-же apache, postfix, postgres и подумай, а что, собственно, ты будешь отслеживать и вообще, каким образом получишь из rc(!) эти самые pid-ы?

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

просто посмотри, как обычно запускаются те-же apache, postfix, postgres и подумай, а что, собственно, ты будешь отслеживать и вообще, каким образом получишь из rc(!) эти самые pid-ы?

apache

PidFile же. В конфиг клея /etc/rc.d/httpd надо вписать тот же путь к pid-файлу, что и в директиву PidFile конфига демона. И всё, клей сможет сказать нам pid.

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

Это разновидность TOUTOC

Чего?

Вне зависимости от вероятности, это говно

Какой ужас, надо срочно одеть алюминиевую шапочку на голову! Вне зависимости от вероятности того, что соседи облучают тебя гипнолучами через стенку, ходить без шапочки — это говно.

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

Ты капец какой странный. А когда ты делаешь kill $pid, ты не задумываешься о race condition каждый раз? Этот изъян by design в архитектуре юниксов, так что ты на насколько десятков лет опоздал с претензиями. Абсолютно ЛЮБОЕ действие с pid может привести к аналогичной проблеме. Выкини немедленно всё POSIX-like со всех своих машин, ведь по твоей логике, «это говно».

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

Тут речь шла о сервисах, а не убийстве произвольных процессов. Очевидно, что ловля SIGCHLD соответствующего изъяна не имеет. Так же очевидно, что сервис должен стопать процесс, который его мониторит.

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

Ну а ты никогда не задумывался, как происходит остановка демона в любой sysvinit-based системе? Да вот так по pid-у из пидфайла и происходит. В моём варианте, по крайней, время неопредленности составляет сотые доли секунды. А в любом, условно говоря, дебиане оно может исчисляться месяцами.

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

Бгг. Разумеется задумывался. Меня это говно всегда нервировало. Надеюсь в systemd сделают (сделано?) как надо ;3

vasily_pupkin ★★★★★
()

Service supervision в виде тупого перезапуска упавшего сервиса - это как-то бедновато. Где контейнеры и прочие средства 21-го века?

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

Где контейнеры и прочие средства 21-го века?

Это не задача инита же. Задача инита сообщить «куда следует», когда процесс подохнет.

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

Назначение ватчдога - быть страховкой от падений, которые по каким-то причинам не успели выявить до введения программы в боевую эксплуатацию. Он не может заменить собой багфикс, принципиально.

Как говорил мой преподаватель по системному программированию: «Последняя ошибка всегда остается в программе». Так что ровно наоборот - никакие багфиксы не могут заменить вотчдог, принципиально.

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

Где контейнеры и прочие средства 21-го века?

Это не задача инита же

А задача чего? У службы должны быть сконфигурированы ресурсные лимиты (== контейнер). При запуске и перезапуске эти лимиты должны быть проведены в жизнь. Кто этим будет заниматься, если не init?

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

Ну так не инит же в этой схеме будет fork-exec делать. Конфигурирует ресурсы тот, кто будет делать fork().

Суть в том, чтобы инит всегда оставался одним и тем же и простым как топор, независимо от того, что там у нас сверху — bash-скрипт для запуска полутора служб или навороченный ынтырпрайз.

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

Так что ровно наоборот

Верны и прямое, и обратное утверждения. Эти меры - взаимодополняющие.

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

Да ну, работало же. Щас посмотрю, что ты написал.

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

Я правильно понял, что при моем методе могли быть проблемы с отрисовкой панели на некоторых wm? Или в чем проблема?

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

Во-первых, ты не проверил работу кода с двумя панелями. Высота вертикальной панели зависит от наличия горизонтальной. Во-вторых, панель после скрытия-появления показывалась только на одном рабочем столе.

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

Во-первых, ты не проверил работу кода с двумя панелями. Высота вертикальной панели зависит от наличия горизонтальной.

Это да.

Во-первых, ты не проверил работу кода с двумя панелями. Высота вертикальной панели зависит от наличия горизонтальной.

Ubuntu 11.10, работает.
Но вообще, следует принять во внимание, что я раньше не сталкивался с панелестроением. В следующий раз буду внимательнее.

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