LINUX.ORG.RU
ФорумTalks

Нейтральный пофигист сколоняется к ненависти

 


0

2

В Debian приехал systemd, а у меня есть демон, который хотелось бы подгружать при старте системы. Ну, думаю, надо потратить пару минут — там же всё просто?
Увы. Это мало того что не просто — взять пример и изменить под свои нужды сложнее, чем раньше, поскольку конфиг содержит (а любой взятый пример их обычно ещё и НЕ содержит и надо думать не только о нужном значении, но и о том какие параметры вообще есть)множество systemd-специфичных вещей, которые здравым смыслом не осиливаются. Но это всё мелочи.
Задача: Есть демон. Демону нужен файл. Пусть к файлу внутри демона прописан просто как «file.dat». Следовательно для корректного запуска мне нужно перейти в директорию с демоном и там его запустить.
Как добиться такого же поведения от systemd я не понял. Разумеется он это может, но вычитывать мегабайты несуществующей документации ради одноразовой элементарной задачи мне не интересно. Мне проще изменить демон так, чтобы он принимал в качестве параметра абсолютный путь к нужным ему файлам.
Вот этим я сейчас и займусь.

★★☆
Ответ на: комментарий от Stahl

То тебе пришлось бы починить демон, чтобы он правильно форкался. Разве нет?

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

Нет. Насколько мне известно, процедура double-fork не совсем тривиальная, и есть шанс её сделать неправильно (так, что процесс якобы исчезнет, но инитом не поймается). Или как-то так. Я не разбираюсь в этой процедуре.

Суть в том, что если в 9k случаев существующих демонов всё работает, а у тебя ломается, то проблема наверняка не в systemd =)

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

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

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

Не-не. Есть некоторое подобие устоявшегося стандарта (как нужно форкаться, чтобы стать демоном). Шелл, который sysvinit, ввиду своей природы «мягкий» и съедает такие фейлы. systemd же написан достаточно строго.

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

У меня везде stable, и переходить пока-что не собираюсь. Только если на oldstable.

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

Да и зачем мне double-fork? Мне одного «за глаза». Я этот код таскаю с собой уже довольно давно:

void daemonize()
{
	int i;

	if(getppid() == 1) return; /* already a daemon */
	i = fork();
	if (i < 0) exit(1); /* fork error */
	if (i > 0) exit(0); /* parent exits */

	/* child (daemon) continues */
	setsid(); /* obtain a new process group */

	//for (i = getdtablesize(); i >= 0; --i) close(i); /* close all descriptors */
	//i = open("/dev/null",O_RDWR);
	//dup(i);
	//dup(i); /* handle standart I/O */

	signal(SIGCHLD,SIG_IGN); /* ignore child */
	signal(SIGTSTP,SIG_IGN); /* ignore tty signals */
	signal(SIGTTOU,SIG_IGN);
	signal(SIGTTIN,SIG_IGN);
	signal(SIGHUP,signal_handler); /* catch hangup signal */
	signal(SIGTERM,signal_handler); /* catch kill signal */

}

И горя не знал, пока не столкнулся с системд.

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

enable

Ага, оно. В общем мой вердикт — неочевидное и переусложнённое.

Справедливости ради стоит отметить, что в sysvinit тоже надо выполнять insserv servicename, чтобы демон запускался автоматически, а иначе он будет стартовать только после /etc/init.d/servicename start.

i-rinat ★★★★★
()
Ответ на: комментарий от Stahl

Собственно, апстрим systemd рекомендует избегать double-fork'а, потому что костыль, а вместо него просто работать в фореграунде и использовать Type=simple.

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

Если форкаешься правильно — режим совместимости. Если не форкаешься вообще — простой режим. Если форкаешься неправильно — лови баги.

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

Насколько я знаю, они вообще рекомендуют использовать dbus.

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

Не путай "скрипты на баше - это плохо" и "возможность избежать тормозов при загрузке, избавившись от кучи сабшеллов - это хорошо".

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

Ха ха ха!

Сначала все программы работающие со звуком оказались «неправильными», теперь все демоны форкаются «неправильно» :)

Вся рота не в ногу! (С)

И всё ради тупого «бинарного» конфига и «сферического в вакууме» алгоритма запуска демонов :(

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

Все? Только один, и таки да, он это делает не совсем правильно.

intelfx ★★★★★
()

Чини свой глючный демон, который не знает, где же ему искать файл или вводи параметр :}

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

Делай без форков, очевидно же :)

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

В нормально спроектированной инит-системе демонам не нужно форкаться вообще в принципе, ну, как в systemd :3 Зачем форкаться есть можно не форкаться? А всё потому, что лапшекод на баше, замотанный изолентой был.

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

В общем мой вердикт — неочевидное и переусложнённое.

А мой вердикт - ты ленивая жопа. Если у тебя enable сложности вызвал, то дальнейшие твои разглагольствования про «неочевидно и переусложнено» можно не читать. Иди в винде галочки расставлять, там все очевидно.

owlmind
()
Ответ на: комментарий от dikiy

Потому что переменная PWD создаётся шеллом и отражает текущую рабочую директорию. Её установка ни на что не влияет.

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

Демон — это долгоживущий процесс без управляющего терминала. Каким образом это достигается — вопрос второй. Можно двойным fork-ом, можно с помощью внешнего инструмента-супервизора (например, systemd). Я считаю, что второй способ правильнее, т. к. он уменьшает количество кода, продублированного в каждом демоне.

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

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

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

Я считаю, что второй способ правильнее, т. к. он уменьшает количество кода, продублированного в каждом демоне.

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

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

Т.е. ты считаешь, что нет (не должно быть) систем без системд и нет (не должно быть) смысла в запуске демона без участия системд?
Я тебя правильно понял?

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

Что браво-то? Хотя да. Этот вывод мне дался нелегко — тяжело было поверить в существование настолько нелепого мнения. Это как на клетке с тигром увидеть надпись «слон». Это возможно, но это малоожидаемо.

Stahl ★★☆
() автор топика

WorkingDirectory=/путь/к/демону

Офигеть сложно.

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

Конечно, неправильно.

Есть ещё хренова туча супервизоров, кроме systemd, и каждый из них может (должен) уметь запускать демоны в стиле Type=simple.

То, что sysvinit так не умеет, — не оправдание. Двойной форк — это костыль.

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

Конечно, неправильно.

Что неправильно?

сть ещё хренова туча супервизоров, кроме systemd,

И что?

То, что sysvinit так не умеет, — не оправдание. Двойной форк — это костыль.

Э-э-э... Вообще-то sysvinit спокойно запускает демоны с одинарным форком. Это как раз системд встал в позу.

Что-то я тебя совсем не понимаю. Или ты не мне отвечаешь.

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

Т.е. ты считаешь, что нет (не должно быть) систем без системд и нет (не должно быть) смысла в запуске демона без участия системд?
Я тебя правильно понял?

Нет, ты понял меня неправильно. Я считаю, что запуск демонов должен производиться в стиле Type=simple, а форк (двойной или одинарный) — это костыль.

Был приведён аргумент (хотя это скорее провокация, а не аргумент), заключающийся в том, что демоны, которые не форкаются самостоятельно, бесполезны, если не использовать systemd.

На это я ответил, что Type=simple правильнее с точки зрения надёжности и дублирования кода, и (следовательно) любой уважающий себя супервизор демонов (не только systemd) должен уметь работать в таком режиме, а то, что sysvinit так не умеет — это его проблемы.

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

Я правильно понял, что double-fork нужен только в некоторых системах и только при условии, что демон зачем-то открывает /dev/ttyX без флага (O_NOCTTY) ?

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

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

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

Т.е. ты считаешь, что в любой системе должен быть некий «супервизор» для демонов? И демонизировать программы следует лишь через него?
Ты программировать умеешь? Видел кусочек кода, отвечающий за демонизацию? Нет? Глянь выше по треду — я приводил этот код. Там даже на Си 20 строк кода.
И ты ради экономии этих 20 строк (а к откомпилированном виде, там и вовсе хорошо если 50 байт соберётся) хочешь впихнуть ещё одну ключевую систему в инфраструктуру линукса?
Если бы тебя призвали в армию, то я не пустил бы тебя в артиллерию — ты же начнёшь по воробьям палить:)

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

Да, считаю именно так. Вообще-то, он и так есть в каждой системе, просто в более чем половине случаев это ущербный sysvinit (который, спешу заметить, занимает больше места и имеет больший футпринт, чем systemd — если считать суммарно с bash'ем и coreutils).

А программировать прекрасно умею. И, кстати, одни только signal-ы в x86 займут байт 100 — по пять байт на аргумент (push imm32), пять байт на вызов (call disp32) и ещё сколько-то там (add reg32, imm32) на корректировку вершины стека :)

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

Ясно. У тебя централизация головного мозга. Вынести, обобщить и всё запретить.
Хорошо работает в режиме белого и пушистого, но очень неудобно в штатном режиме.

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