The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Релиз Debian 9.0 'Stretch' намечен на 17 июня, opennews (??), 27-Май-17, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


26. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +7 +/
Сообщение от danonimous (?), 27-Май-17, 14:06 
Переходи на Devuan - там нет этих проблем.
Ответить | Правка | Наверх | Cообщить модератору

33. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 27-Май-17, 16:09 
Вообще, достаточно бессмысленные советы. Чтобы реализовать то же самое на скриптах bash мне понадобилось бы гораздо больше времени и строчек кода. Как минимум мне самому пришлось бы реализовывать межпроцессное взаимодействие для распараллеленной загрузки моих служб по событийной модели. Мне и так хватает этого в коде на Си. И если с парой-тройках служб это ещё можно сделать без автоматизации, то с 10-ю мне пришлось бы уже сильно поднапрячься и реализовывать свою систему загрузки с зависимостями. Ну и зачем мне это, если такую систему уже изобрели до меня? Меньше времени уж тогда займёт, разобраться с исходниками, сделать и отправить патч, если там есть ошибка. Я понимаю, что это деление на за и против - вроде субкультур, но тут дела программистов. Если для обычного человека при переходе на двухядерный процессор с меньшей частотой всё просто стало работать медленнее, то программист знает, что на тот момент разработчики ПО просто не заморачивались на многопоточность. Это просто аналогия, но, думаю, вы поняли идею.
Ответить | Правка | Наверх | Cообщить модератору

42. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +2 +/
Сообщение от freehckemail (ok), 27-Май-17, 17:42 
> Чтобы реализовать то же самое на скриптах bash мне понадобилось бы гораздо больше времени и строчек кода.
> (ну и пробовал READY=1 через socat в bash, и вариант через python).

socat-то конечно "проще", чем netstat -nxp | grep ...

> И если с парой-тройках служб это ещё
> можно сделать без автоматизации, то с 10-ю мне пришлось бы уже
> сильно поднапрячься и реализовывать свою систему загрузки с зависимостями.

LSB-заголовки в run-скриптах init.d обеспечивают загрузку по зависимостям.

Ответить | Правка | Наверх | Cообщить модератору

44. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 27-Май-17, 19:03 
Система зависимостей предполагает оповещение о том, что процесс проинициализировался (например, сервер проинициализировал сокет к нему можно подключаться), а не просто запустился. Не успел столкнуться в с этим в SysV, но может расскажете, как там процесс оповещает о том, что он готов? У systemd описание unit-файлов в этом плане достаточно простым и понятным оказалось. Есть, конечно много спорных моментов, но в целом пригодно к использованию.
Ответить | Правка | Наверх | Cообщить модератору

49. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +2 +/
Сообщение от Аноним (-), 27-Май-17, 20:36 
> Система зависимостей предполагает оповещение о том, что процесс проинициализировался
> (например, сервер проинициализировал сокет к нему можно подключаться), а не просто
> запустился. Не успел столкнуться в с этим в SysV, но может
> расскажете, как там процесс оповещает о том, что он готов? У
> systemd описание unit-файлов в этом плане достаточно простым и понятным оказалось.
> Есть, конечно много спорных моментов, но в целом пригодно к использованию.

Если есть зависимость от сокета, решается вбиванием перед запуском костыля типа

while ! [ -S "$SOCKET" ]; do sleep 1; done

Но на самом деле ситуация довольно редкая. Большинство демонов пытаются подключиться к сокету не сразу при запуске, а только когда возникает необходимость, и если им это не удалось — спокойно переподключаются позднее. Если там наколенная поделка — лучше её допилить, чтобы она вела себя именно так, даже при использовании systemd.

Ответить | Правка | Наверх | Cообщить модератору

53. "Релиз Debian 9.0 Stretch намечен на 17 июня"  –3 +/
Сообщение от Аноним (-), 27-Май-17, 22:16 
Большая часть межпроцессного взаимодействия в Линуксе построена на сокетах (unix-). Если есть зависимость, значит она вероятнее всего будет связана с запуском сервера. Костыли со sleep - это бред. Допускаются только блокирующиеся операции. Полагаю, что большая часть ПО в дистрибутиве будет использовать сокеты. Самый простой пример - Иксы. Другой пример - d-bus. И как думаете, что будет, если сначала стартануть Иксы, а затем openbox? openbox попытается подключиться к иксам, которые ещё не успели начать прослушивать unix-сокет. Конечно, в дистрибутивах так не делают (openbox скорее всего будет просто дочерним процессом для иксов), это вполне допустимая ситуация.
Ответить | Правка | Наверх | Cообщить модератору

55. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +2 +/
Сообщение от Аноним (-), 27-Май-17, 23:04 
И как же, по-Вашему, все жили без systemd?
Недоступность сокета — это рядовая ситуация, а не фатальная ошибка, особенно если учесть, что сокет может быть не только локальным, но и сетевым. Все демоны (именно демоны, запускаемых руками клиентских приложений это не касается) должны уметь обрабатывать такую ситуацию.
Ответить | Правка | Наверх | Cообщить модератору

59. "Релиз Debian 9.0 Stretch намечен на 17 июня"  –1 +/
Сообщение от Аноним (-), 28-Май-17, 08:42 
Может приведёте хотя бы один пример? Я по опыту не помню подобных ситуаций. Обычно  просто делается завершение работы и всё.
Ответить | Правка | Наверх | Cообщить модератору

60. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 28-Май-17, 12:03 
Приведите пример того, что завершается.
Ответить | Правка | Наверх | Cообщить модератору

62. "Релиз Debian 9.0 Stretch намечен на 17 июня"  –2 +/
Сообщение от Аноним (-), 28-Май-17, 15:16 
openbox, x11vnc, zenity и скорее всего любое графическое приложение, если сокет иксов не создан. Это из того, с чем сталкивался на своём опыте.

Другой пример, посерьёзнее. Что будет, если прокси-сервер nginx стартанёт после сервера bind9, в котором локальная доменная зона, указанная в конфигурации nginx?

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

Ответить | Правка | Наверх | Cообщить модератору

64. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 28-Май-17, 18:36 
> openbox, x11vnc, zenity и скорее всего любое графическое приложение, если сокет иксов не создан

А что системде уже и их сам запускает? Вообще это совершенно не дело системы инициализации. Я, повторюсь, писал про

>> именно демоны, запускаемых руками клиентских приложений это не касается
> Что будет, если прокси-сервер nginx стартанёт после сервера bind9, в котором локальная доменная зона, указанная в конфигурации nginx?

Думаю, выдаст на пришедший в этот момент запрос 502, после поднятия бинда заработает нормально. Разве не так?

> попробуйте запустить какой-нибудь сервис, работающий через dbus, а только потом запустите сам dbus

Много ли системных сервисов используют dbus, кроме системде? Я ни одного не припоминаю, так что сделать этого, увы, не смогу.

Ответить | Правка | Наверх | Cообщить модератору

65. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 28-Май-17, 21:09 
> Думаю, выдаст на пришедший в этот момент запрос 502, после поднятия бинда заработает нормально. Разве не так?

Ну, вы так думаете из-за того, что не знаете, как работает ДНС и как делается обработка ошибок в ПО (lazy). nginx в Debian 7 делает запрос ip-адреса, чтобы начать прослушивание. Но т.к. адреса нет просто завершается по ошибке. И сюрприз, сайт лежит. Но достаточно его стартануть опять, как он снова работает. И не каждый сисадмин догадается в чём дело. А проблема проявлялась, когда сервер DNS включали после того, как включали сервер, на котором nginx был в роли прокси-сервера. Обычное состояние гонки. Даже не обязательно, чтобы это были зависимости процессов, проблема может быть даже на разных компьютерах.

Но да, есть ПО, которое корректно обрабатывает такие ситуации. Например, openvpn.

> Много ли системных сервисов используют dbus, кроме системде? Я ни одного не припоминаю, так что сделать этого, увы, не смогу.

Хм. Убейте демон dbus и попробуйте сделать что-нибудь через NetworkManager. ;)

Ответить | Правка | Наверх | Cообщить модератору

61. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 28-Май-17, 12:06 
Просто вот даже растерялся как-то, всё тупо работает, и никогда не задумывался, что там с сокетами на момент запуска... Ну скажем nginx и не подумает завершаться, если не достучится до сокета какого-нибудь php-fpm.
Ответить | Правка | К родителю #59 | Наверх | Cообщить модератору

54. "Релиз Debian 9.0 Stretch намечен на 17 июня"  –2 +/
Сообщение от Аноним (-), 27-Май-17, 22:23 
>> Чтобы реализовать то же самое на скриптах bash мне понадобилось бы гораздо больше времени и строчек кода.
>> (ну и пробовал READY=1 через socat в bash, и вариант через python).
> socat-то конечно "проще", чем netstat -nxp | grep ...

Сначала не обратил внимания, причём тут netstat вообще? Название сокета в переменной окружения есть. Права доступа я могу через консоль посмотреть.

Ответить | Правка | К родителю #42 | Наверх | Cообщить модератору

76. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от freehckemail (ok), 29-Май-17, 16:29 
>>> Чтобы реализовать то же самое на скриптах bash мне понадобилось бы гораздо больше времени и строчек кода.
>>> (ну и пробовал READY=1 через socat в bash, и вариант через python).
>> socat-то конечно "проще", чем netstat -nxp | grep ...
> Сначала не обратил внимания, причём тут netstat вообще?
> Название сокета в переменной окружения есть.
> Права доступа я могу через консоль посмотреть.

Соображений тут много. Начнём с того, что файл unix-сокета может уже быть, но его не обязательно слушают. Проверяется легко: между bind() и listen() вставьте usleep в тысячу секунд. (Это я пишу для комментаторов выше, которые рекомендуют [ -S "$socket" ] в цикле).

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

Вот Вы посылаете, как я понял, строку "READY=1" через socat. Откуда нам знать, что демон на той стороне корректно реагирует на это сообщение? Если уж использовать socat, то я бы воздержался от посылки чего бы там ни было, ограничившись чем-то вроде echo -n | socat - UNIX-CLIENT:/tmp/checker.socket

Это безопаснее, хотя и не лишено недостатков: что, если демон при отсутствии ввода после установки соединения зависает? Мне вот когда-то такой демон попадался. Давно, правда, дело было, я уже не вспомню название. Но такое бывает.

Посему во избежание проблем всё-таки правильнее имхо использовать netstat, грепая по имени сокета и слову LISTEN. Этот вариант безопасен и не вызывает проблем от слова совсем: грепнуть вывод netstat гораздо проще, чем разгребать возможные проблемы, связанные с использованием socat.

Ответить | Правка | Наверх | Cообщить модератору

77. "Релиз Debian 9.0 Stretch намечен на 17 июня"  –1 +/
Сообщение от Аноним (-), 29-Май-17, 19:42 
socat был необходим лишь для эксперимента, чтобы убедиться, что данные в сокет вообще уходят. То, что они приходят к демону понятно и так, т.к. не было возвращено ошибок. Соответственно на стороне сервера была исполнена read().

Вообщем, обходной путь найден, но в systemd ошибка присутствует. systemd-notify абсолютно неработоспособна. Пока могу предполагать, что проблема из-за того, что systemd пытается определить принадлежность к cgroups по PID. Но делает это после того, как сообщение было получено. Соответственно, процесс уже завершился, а сообщение игнорируется, т.к. невозможно было определить cgroup. Идея интересная, - один сокет на все процессы, но реализация, похоже, неграмотная. Я бы в протокол добавил обязательно ожидание подтверждения от демона того, что сообщение получено. Блокирующийся read() не дал бы процессу завершиться и можно было бы определить его cgroup. Но как именно там реализовано пока не знаю.

Обходной путь - переписать скрипт c bash на python и использовать systemd.daemon.notify('READY=1'). Пока устраивает.

Отчёт об ошибке отправлен в Debian. Сам я пытался найти место, где происходит приём сообщений, но пока не нашёл. Код там нельзя назвать интуитивно понятным. Нашёл функцию, которая определяет cgroup по PID, но по её вызовам не нашёл абсолютно ничего полезного. Даже по слову READY я не смог найти место, где данная строка обрабатывается.

Ответить | Правка | Наверх | Cообщить модератору

78. "Релиз Debian 9.0 Stretch намечен на 17 июня"  +/
Сообщение от Аноним (-), 29-Май-17, 19:55 
Учитывая, что тут любят придираться к мелочам, поправлю себя и уточню: read(), либо же recv().
Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру