LINUX.ORG.RU

Пример демона реагирующего на start stop status

 , ,


0

1

Подскажите пример кода демона правильно реагирующего на команды start/stop/status. Все примеры и мануалы которые у меня получается найти ограничиваются только непосредственно старта демона и его общения с потомками посредством сигналов. Но все приличные демоны умеют помимо этого и останавливаться с консоли, и выводить краткий статус. Как реализовать в своем демоне такое-же поведение?



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

А в линуксе есть какие-то стандарты на эту тему? Вроде же все костыляют как хотят

Stil ★★★★★
()
[Unit]
Description=My Daemon
After=syslog.target

[Service]
Type=forking
PIDFile=/run/mydaemon.pid
ExecStart=/usr/sbin/mydaemond

[Install]
WantedBy=multi-user.target
redgremlin ★★★★★
()
Ответ на: комментарий от Deleted

Ну вот на примере скрипта для yandex-disk, там для вызова с параметром status просто запускается yandex-disk status, который выводит краткую информацию с работающего в этот момент демона. Это мне не сильно помогло понять как реализовано все в коде.

rteer34
() автор топика

Вроде, ТС спрашивает не про systemd и init, а про требуемый правильный интерфейс своего демона-сервера-программы, про принятое поведение демона в системе (логи, перечитывание конфига, реакция на сигналы).

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

Нет же, мне нужно не скрипт запуска демона написать, а самого демона.

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

systemd юниты - это не то, это интерфейс, который прячет от (внезапно) systemd способы взаимодействия с каждым конкретным демоном, а ТС, на сколько я понял, хочет примеры реализации этих механизмов в собственно демоне, а не как их завернуть в инит

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

Я не писал демонов под линукс, так что даже не думал, но наверное через сокет для управления, который будет читаться демоном

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

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

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

Можешь ловить сигналы в демоне, например. USR2 - status, SIGTERM - stop.

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

У меня нет единственно верного источника. Накопились некие практические правила. Наверно, кто-то посоветуют толковую статью

Типа," использовать SIGHUP для перечитывания конфига", " при SIGTERM попытка побыстрому завершить транзакции, сохраниться и завершиться", «логгинг в stdout (проще всего) или syslog, потом уже в скрипте запуска организуется логгинг под систему», «файловый pipe для управления демоном - можно использовать для status. либо socket, по ситуации.»

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

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

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

Значит пойду читать про сокеты и прочее межпроцессное взаимодействие

man signals

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

В дебиан были загрузочные скрипты (даже с зависимостями), вроде.

stopitplease
()
Ответ на: комментарий от anonymous

Каждый раз, когда вижу systemd-юнит - такое впечатление, что гляжу на кучку собачьего говна на аллее.

Обращаться к специалисту пробовал?

Специалист, решающий подобные проблемы, мне тупо не по карману.

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

«виндузячьи» ini-файлы вызывают у тебя батхёрт?

Нет. Они вызывают во мне брезгливость.

это разновидность батхёрта

У вас, вендузятнегов, всё через батт %)

tailgunner ★★★★★
()

В общем стало все понятно. Контроль запуска буду проводить по семафору, а сообщения о остановке и передачу статуса от демона реализую через очередь сообщений. Спасибо всем кто отписался по делу в тред.

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

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

Конечно, можно и так, но SysV IPC для таких целей не используют (их вообще мало используют).

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

Да вроде и неплох этот пид файл, но при чтении инфы о ipc семафор мне показался более надежным.

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

Отвергая предлагай альтернативу

Тебе уже всё сказали - сигналы, start-stop-daemon, смотреть скрипты запуска реальных служб. Как ты дошел до идеи использовать SysV IPC - это для меня загадка. Вполне очевидно, что ты с ним не работал раньше.

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

Чем SysV IPC плох? Судя по мануалам там все прозрачно и легко. И именно очередью проще всего передать небольшую текстовую информацию от демона работающего с отключенными потоками ввода/вывода. Как дошел до идеи? Погугли межпроцессовые взаимодействия - первая же сотня ссылок тебя в них ткнет.

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

Чем SysV IPC плох?

Кроме того, что избыточен для озвученной задачи? Неудобной работой с пространством имен и тем, что жизненный цикл объектов не привязан к жизненному циклу процесса.

Судя по мануалам там все прозрачно и легко

А весь мир - идиоты, потому что пользуются pid-файлами и сигналами.

И именно очередью проще всего передать небольшую текстовую информацию от демона работающего с отключенными потоками ввода/вывода

Правда? Не через FIFO, а именно через очередь сообщений? Ооокей.

Погугли межпроцессовые взаимодействия

/me .oO( почему половина тех, кто может вбить в гугл запрос, считают себя такими же умными, как сам гугл? )

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

Специалист, решающий подобные проблемы, мне тупо не по карману.

Улыбнуло, спасибо.

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

А весь мир - идиоты, потому что пользуются pid-файлами и сигналами.

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

Можно придумать случай без перезагрузки, и даже с проверкой процесса (если два демона). Вопрос: почему, скажем, обычно не используют flock/fcntl на pid-файл?

anonymous
()
Ответ на: комментарий от rteer34

А весь мир - идиоты, потому что пользуются pid-файлами и сигналами.

Аргумент уровня детсада.

okay.jpg

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

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

Отключении питания? Странно, потому что /var/run чистится довольно рано при раскрутке системы.

почему, скажем, обычно не используют flock/fcntl на pid-файл?

Зачем? От путаницы в случае внезапной смерти демона это не спасет, а если завершение штатное, демон сам удалит свой pid-файл (или инитскрипт сделает это за него).

tailgunner ★★★★★
()

Я просто сигналы посылаю. Если что-то посложней нужно, использую IPC вроде очередей, или mmap в разделяемой памяти, или еще какую фигню.

Для однозначной гарантии уникальности использую pid-файл + поиск по дереву proc одноименных процессов (если pid-файл показывает, что таких процессов не запущено). Правда, есть тут косячок-с — чтобы не было race conditions приходится делать flock на pid-файл.

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

В то время как именованный семафор гарантированно заблокирует запуск второго демона. Для меня сейчас очевидно что это лучший из предложенных в треде способов. Тем более что остальные средства SysV IPC (очереди вы указали) вы уже используете и они у вас успешно работают.

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

именованный семафор

Это какой-то жуткий велосипед, в данном случае не нужный. Все элегантно решается при помощи flock на псевдофайл в shm, то бишь мьютексом.

// семафоры я вообще ни разу не использовал — оверхед же!

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

Ой вей. Ну я все же не угомонюсь пока вы не объясните почему это жуткий велосипед. Семафор три строчки кода (с обработкой ошибок аж целых 9), которые гарантированно блокируют повторный запуск демона. Без единого слабого места. Почему это плохо?

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

Семафор три строчки кода (с обработкой ошибок аж целых 9), которые гарантированно блокируют повторный запуск демона. Без единого слабого места.

Опубликуй эти 9 строчек.

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

Это примерно как использовать printf в микроконтроллерах: можно, но не стоит.

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