Сервисы в Linux
От: AlexGin Беларусь  
Дата: 07.07.20 12:38
Оценка: -1
Доброе время суток, уважаемые коллеги!

Имеется вопрос по сервисам в OS Linux (здесь и далее подразумеваю Ubuntu 18.04):

Обязательно ли сервис (микросервис) создавать как демон?
То есть — с двойным вызовом fork() в начале исполнения приложения?
Можно ли просто — как консольное приложение?

Создать демона не сложно, но есть проблема:

Подсистема логирования spdlog:
https://github.com/gabime/spdlog
конфликтует с приложением-демоном, но при этом вполне нормально уживается с обычними "консольными"

Мне хотелось бы применять именно этот вариант логирования, так как он имеет много удобного и полезного функционала.

Вот подробнее:
https://github.com/gabime/spdlog/issues/166
при этом — даже если создание "логгера" происходит после перехода в режим демона — приложение крашиться.

Товарищи (наши разработчики) мне подсказывают:
-Просто сделать "консольку" и не заниматься "демоном"!

Правильно ли такое решение?

Разработку веду на C++11 и Qt5.

Заранее благодарен за любые подсказки!

P.S. Ранее я применял "велосипедный" логгер, но теперь (в новых проектах) хотел бы применять более удобный и функциональный spdlog.
Отредактировано 08.07.2020 3:43 AlexGin . Предыдущая версия .
Re: Сервисы в Linux
От: Zhendos  
Дата: 07.07.20 14:05
Оценка: 4 (1) +1
Здравствуйте, AlexGin, Вы писали:

AG>Доброе время суток, уважаемые коллеги!


AG>Имеется вопрос по сервисам в OS Linux (здесь и далее подразумеваю Ubuntu 18.04):


AG>Обязательно ли сервис (микросервис) создавать как демон?

AG>То есть — с двойным вызовом fork() в начале исполнения приложения?
AG>Можно ли просто — как консольное приложение?

Можно, systemd (раз мы говорим о Ubuntu 18.04) сам обо всем позаботиться,
если указать нужный type (см. https://www.freedesktop.org/software/systemd/man/systemd.service.html),
и stdout/stderr он сам в логи кстати записывает.
Re[2]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 07.07.20 14:24
Оценка:
Здравствуйте, уважаемый Zhendos, Вы писали:
...

Z>Можно, systemd (раз мы говорим о Ubuntu 18.04) сам обо всем позаботиться,

Z>если указать нужный type (см. https://www.freedesktop.org/software/systemd/man/systemd.service.html),
Z>и stdout/stderr он сам в логи кстати записывает.

Ну я так понимаю, что systemd мне поможет стартовать сервис.
Что же касается логов (а мне нужно не только "краши" и "ерроры" но и информацию о нормальной работе иногда видеть) — здесь будет spdlog.
Тем более, что его же я планирую применять и для GUI-шных утилит.

Насчет systemd — я копаю в правильном направлении? В смыссле данных ссылок:
https://en.wikipedia.org/wiki/Systemd
https://www.linode.com/docs/quick-answers/linux/start-service-at-boot
https://habr.com/ru/post/275645
Отредактировано 07.07.2020 15:04 AlexGin . Предыдущая версия .
Re[3]: Сервисы в Linux
От: Zhendos  
Дата: 07.07.20 15:07
Оценка: 6 (1) +1
Здравствуйте, AlexGin, Вы писали:

AG>Здравствуйте, уважаемый Zhendos, Вы писали:

AG>...

Z>>Можно, systemd (раз мы говорим о Ubuntu 18.04) сам обо всем позаботиться,

Z>>если указать нужный type (см. https://www.freedesktop.org/software/systemd/man/systemd.service.html),
Z>>и stdout/stderr он сам в логи кстати записывает.

AG>Ну я так понимаю, что systemd мне поможет стартовать сервис.

AG>Что же касается логов (а мне нужно не только "краши" и "ерроры" но и информацию о нормальной работе иногда видеть) — здесь будет spdlog.

Ну это зависит от того кто будет это админить, если не вы то конечно желательно писать
в stdout/stderr или syslog.

AG>Насчет systemd — я копаю в правильном направлении? В смыссле данных ссылок:

AG>https://en.wikipedia.org/wiki/Systemd
AG>https://www.linode.com/docs/quick-answers/linux/start-service-at-boot
AG>https://habr.com/ru/post/275645

Ну если уже есть доступ к Linux машине то лучше прочитать: man 5 systemd.service
и посмотреть примеры в /usr/lib/systemd/system ,
там нужно где-то строчек пять написать и дать одну команду чтобы
ваш сервис стартовал при запуске.
Отредактировано 29.03.2021 18:44 Zhendos . Предыдущая версия .
Re: Сервисы в Linux
От: Reset  
Дата: 08.07.20 04:24
Оценка: 4 (1) +1
AG>Обязательно ли сервис (микросервис) создавать как демон?

Уже повсеместно, в том числе в Ubuntu используется systemd, который сам умеет дважды форкаться. Т.е. ты пишешь обычное консольное приложение, а systemd запустит обертку, которая форкнется и запустит твое приложение. Более того, тот же systemd будет следить за приложением и, если оно упадет, то сможет перезапустить. Логи приложения, которое оно выдает на stdout/stderr, обертка systemd запишет в лог.

Короче, я уже даже и не знаю причины, зачем демону самостоятельно форкаться (а также менять work_dir, переоткрывать stdin/out/err и чего там еще делает демон кроме форка). Когда твоя программа — системный демон, это настраивается в конфиге systemd, а во время отладки эти форки и не нужны вовсе.
Re[2]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 08.07.20 07:37
Оценка:
Здравствуйте, уважаемый Reset, Вы писали:

R>Уже повсеместно, в том числе в Ubuntu используется systemd, который сам умеет дважды форкаться. Т.е. ты пишешь обычное консольное приложение, а systemd запустит обертку, которая форкнется и запустит твое приложение. Более того, тот же systemd будет следить за приложением и, если оно упадет, то сможет перезапустить. Логи приложения, которое оно выдает на stdout/stderr, обертка systemd запишет в лог.

+100500
Да, я в курсе всего этого.

R>Короче, я уже даже и не знаю причины, зачем демону самостоятельно форкаться (а также менять work_dir, переоткрывать stdin/out/err и чего там еще делает демон кроме форка). Когда твоя программа — системный демон, это настраивается в конфиге systemd, а во время отладки эти форки и не нужны вовсе.


Я также не знаю причины, которая бы мешала не сегодня применять обычное консольное приложение в качестве демона.
Но на всякий случай, мне хотелось удостовериться в этом (чтобы по возможности исключить какой-либо нежданчик).
Re[2]: Сервисы в Linux
От: vsb Казахстан  
Дата: 08.07.20 07:41
Оценка:
Здравствуйте, Reset, Вы писали:

R>Короче, я уже даже и не знаю причины, зачем демону самостоятельно форкаться (а также менять work_dir, переоткрывать stdin/out/err и чего там еще делает демон кроме форка). Когда твоя программа — системный демон, это настраивается в конфиге systemd, а во время отладки эти форки и не нужны вовсе.


Чтобы запускаться на других юниксах и на линуксах без systemd.
Re[3]: Сервисы в Linux
От: Reset  
Дата: 08.07.20 08:21
Оценка:
R>>Короче, я уже даже и не знаю причины, зачем демону самостоятельно форкаться (а также менять work_dir, переоткрывать stdin/out/err и чего там еще делает демон кроме форка). Когда твоя программа — системный демон, это настраивается в конфиге systemd, а во время отладки эти форки и не нужны вовсе.

vsb>Чтобы запускаться на других юниксах и на линуксах без systemd.


Расскажи реальный практичный конкретный пример, когда это нужно (разработка под Астру — это для меня не реальный случай, поддержка RedHat5 тоже за гранью реальности).

Ну, т.е. исключения бывают из любого правила, но я практик и для меня сейчас двойной форк выглядит, как задротство старперов из академической сферы, которые не способны адаптироваться к реальности. Gentoo без systemd или какой-нибудь Devuan — задротство в чистом виде. Впрочем, расскажешь реальный пример нужности двойного форка — сменю мнение (я гибкий).

P.S. Я пропустил по началу "на других юниксах". Из других юниксов для меня нечто практически полезное разве что экзотика в виде AIX или что там еще делают в IBM и MacOS. Солярка — маргинальщина и сдохнет скоро вместе со спарками, чпукс уже сдох, других даже не знаю (даже если за работу с ними платят нормальные деньги — валить оттуда нужно как можно скорее). Очень сомневаюсь, что один и тот же демон будет работать на Linux и чем-то из этого. Да и разработчик под такие OS вопросы задавать не станет (особенно, когда других вариантов и нет вовсе).
Re[3]: Сервисы в Linux
От: Reset  
Дата: 08.07.20 08:26
Оценка: +1
AG>Я также не знаю причины, которая бы мешала не сегодня применять обычное консольное приложение в качестве демона.
AG>Но на всякий случай, мне хотелось удостовериться в этом (чтобы по возможности исключить какой-либо нежданчик).

Забыл написать, что твой консольный демон, все же должен обрабатывать сигналы для нормального завершения процесса: SIGHUP, SIGTERM, SIGQUIT (даже, если ему запрос на завершение работы будут присылать как-то еще, командой через сокет, например). Все-таки это не простое консольное приложение.
Re[4]: Сервисы в Linux
От: Zhendos  
Дата: 08.07.20 08:48
Оценка:
Здравствуйте, Reset, Вы писали:


R>Расскажи реальный практичный конкретный пример, когда это нужно (разработка под Астру — это для меня не реальный случай, поддержка RedHat5 тоже за гранью реальности).


А что не так с Астра Linux, в текущей версии там systemd?
Re[3]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 08.07.20 08:58
Оценка:
Здравствуйте, уважаемый vsb, Вы писали:

vsb>Чтобы запускаться на других юниксах и на линуксах без systemd.


1) Задачи охватить все версии UNIX & Linux — не ставиться.
2) Если бы всё-таки подобная задача стояла, то (подозреваю) данный вопрос оказался бы "вишенкой на торте".
3) Как я понимаю, все популярные современные дистры Linux всё-таки используют подсистему systemd.
Re[4]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 08.07.20 10:09
Оценка:
Здравствуйте, Reset, Вы писали:

R>Забыл написать, что твой консольный демон, все же должен обрабатывать сигналы для нормального завершения процесса: SIGHUP, SIGTERM, SIGQUIT (даже, если ему запрос на завершение работы будут присылать как-то еще, командой через сокет, например). Все-таки это не простое консольное приложение.


Речь, как я понимаю, идет об этом:
https://doc.qt.io/qt-5/unix-signals.html
Re: Сервисы в Linux
От: reversecode google
Дата: 08.07.20 10:18
Оценка: -1 :)
12 сообщений флуда от людей далеких от программирования ?
я вбил spdlog daemon
в гугл
открыл по ссылкам и убедился что spdlog без проблем используют для логирование в режиме демона под юниксом
https://git.coffeenet.nl/Coffee2Code/LinGato/blob/f95cbcbbe3bb94040d45bfa77f071116b98a157a/src/daemon/daemon.cpp

когда же уже на ктыве начнут гуглить прежде чем флудить ?
Отредактировано 08.07.2020 11:04 reversecode . Предыдущая версия .
Re[2]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 08.07.20 11:27
Оценка: +1
Здравствуйте, reversecode, Вы писали:

R>12 сообщений флуда от людей далеких от программирования ?

R>я вбил spdlog daemon
R>в гугл
R>открыл по ссылкам и убедился что spdlog без проблем используют для логирование в режиме демона под юниксом
R>https://git.coffeenet.nl/Coffee2Code/LinGato/blob/f95cbcbbe3bb94040d45bfa77f071116b98a157a/src/daemon/daemon.cpp

R>когда же уже на ктыве начнут гуглить прежде чем флудить ?


Мне не флудить и НЕ В КОНСОЛЬ писать логи!

Мне нужено логирование — по дням, когда каждому дню будет соответствовать свой лог-файл.
Посему, тот вариант применения spdlog, который указан в Вашей ссылке, не подходит.

P.S. До отправки первоначального сообщения имело место:
a) Советование с коллегами по работе;
b) Поиск в гугле примеров по spdlog и их выполнение
c) Обнаружение НА ПРАКТИКЕ проблемы
d) Гугление на тему имеющейся проблемы (а не сферический запрос в ваккуме) — выявившее
действительное наличие данной проблемы:

...spdlog does not support multi process. I dont think there is a quick workaround

Вот здесь: https://github.com/gabime/spdlog/issues/166
e) Практическое опробование решений по данной проблеме (которые, кстати, и не прошли)
f) Применение библиотеки spdlog в моих собственных небольших (тестовых) проектах.
Отредактировано 08.07.2020 20:47 AlexGin . Предыдущая версия . Еще …
Отредактировано 08.07.2020 11:31 AlexGin . Предыдущая версия .
Re[4]: Сервисы в Linux
От: vsb Казахстан  
Дата: 08.07.20 13:36
Оценка:
Здравствуйте, Reset, Вы писали:

vsb>>Чтобы запускаться на других юниксах и на линуксах без systemd.


R>Расскажи реальный практичный конкретный пример, когда это нужно (разработка под Астру — это для меня не реальный случай, поддержка RedHat5 тоже за гранью реальности).


RHEL 6 тоже на system v init.

R>Ну, т.е. исключения бывают из любого правила, но я практик и для меня сейчас двойной форк выглядит, как задротство старперов из академической сферы, которые не способны адаптироваться к реальности. Gentoo без systemd или какой-нибудь Devuan — задротство в чистом виде. Впрочем, расскажешь реальный пример нужности двойного форка — сменю мнение (я гибкий).


Ну я рассказал для полноты информации. А то для кого-то и за пределами Windows жизни нет.

R>P.S. Я пропустил по началу "на других юниксах". Из других юниксов для меня нечто практически полезное разве что экзотика в виде AIX или что там еще делают в IBM и MacOS. Солярка — маргинальщина и сдохнет скоро вместе со спарками, чпукс уже сдох, других даже не знаю (даже если за работу с ними платят нормальные деньги — валить оттуда нужно как можно скорее). Очень сомневаюсь, что один и тот же демон будет работать на Linux и чем-то из этого. Да и разработчик под такие OS вопросы задавать не станет (особенно, когда других вариантов и нет вовсе).


OpenBSD, FreeBSD, NetBSD.
Re: Сервисы в Linux
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 10.07.20 11:37
Оценка: 6 (1)
Здравствуйте, AlexGin, Вы писали:

AG>Обязательно ли сервис (микросервис) создавать как демон?

AG>То есть — с двойным вызовом fork() в начале исполнения приложения?
AG>Можно ли просто — как консольное приложение?

Вообще и для демона двойной форк много лет как не нужен. Он был нужен, когда процесс, который лидер сессии, не имел терминала и при открытии терминала автоматом получал этот терминал как управляющий.
Не знаю, сколько лет назад это наконец убрали из Linux, но точно больше 10.
Сейчас и для явного демона достаточно fork + setsid.

AG>Вот подробнее:

AG>https://github.com/gabime/spdlog/issues/166
AG>при этом — даже если создание "логгера" происходит после перехода в режим демона — приложение крашиться.

Перед форком полностью закрыть лог, после форка переоткрыть с нуля.

У нас такая же проблема с log4cplus. Увы, продвинутые логгеры они такие, диверсионные.

AG>Товарищи (наши разработчики) мне подсказывают:

AG>-Просто сделать "консольку" и не заниматься "демоном"!
AG>Правильно ли такое решение?

Вполне. Демонизацию вам может обеспечить и внешнее средство.
Есть systemd (уже говорили), есть другие переходники для демонов, есть screen
The God is real, unless declared integer.
Re[2]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 11.07.20 06:35
Оценка:
Здравствуйте, уважаемый netch80, Вы писали:
...
N>У нас такая же проблема с log4cplus. Увы, продвинутые логгеры они такие, диверсионные.

Да, с моим старым простым файловым логером — этих проблем не было,
но и функционал там весьма ограниченный —
простое ежедневное логирование (имя файла формируется по текущей дате).

...просто сделать "консольку"...
N>Вполне. Демонизацию вам может обеспечить и внешнее средство.
N>Есть systemd (уже говорили), есть другие переходники для демонов, есть screen
+100500

Меня прежде всего интересует вышеупомянутый функционал:
ежедневное логирование, когда имя файла формируется по текущей дате.

Библиотека spdlog решает этот вопрос элементарно.

Велючаем заголовочники:
#include "spdlog/spdlog.h"
#include "spdlog/sinks/daily_file_sink.h"


По старту — подготавливаем ежедневное логирование:
      // Create a daily logger - a new file is created every day on 1:10am
      auto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 1, 10);
      logger->set_level(spdlog::level::info);
      logger->flush_on(spdlog::level::info);
 
      spdlog::set_default_logger(logger);


И потом — используем это добро:
      spdlog::info("Application 'MyCoolApp' started!");
...
      spdlog::error("LoadObject ERROR: {}", sErr.c_str());


Предполагается, что это серверное приложение (загрузили — и на неделю "забыли").
Что же мне в этом случае даст лог на "экране"?

P.S. Впрочем — библиотека spdlog достаточно гибкая и многофункциональная,
для настольных приложений — я могу выбоать любой (более подходящий) вериант логера
При этом в кодах проекта — строки, использующие логирование, не меняются!
Отредактировано 14.07.2020 11:19 AlexGin . Предыдущая версия . Еще …
Отредактировано 11.07.2020 6:46 AlexGin . Предыдущая версия .
Отредактировано 11.07.2020 6:36 AlexGin . Предыдущая версия .
Re[3]: Сервисы в Linux
От: netch80 Украина http://netch80.dreamwidth.org/
Дата: 11.07.20 08:36
Оценка:
Здравствуйте, AlexGin, Вы писали:

AG>Предполагается, что это серверное приложение (загрузили — и на неделю "забыли").

AG>Что же мне в этом случае даст лог на "экране"?

Кому вопрос-то? Я не предлагал писать лог на экран, хотя при крошечных объёмах это вполне вариант. Я говорил, что внешние аналоги демонизации могут быть самыми разными.

А логгирование stdout/stderr имеет независимый смысл — фиксация хода/проблем общего функционирования приложения.

AG>P.S. Впрочем — библиотека spdlog достаточно гибкая и многофункциональная,

AG>для настольных приложений — я могу выбоать любой (более подходящий) вериант логера
AG>При этом в кодах проекта — строки, использующие логирование, не меняются!

И что? Это много где так (тот же набивший оскомину log4cplus).
Вот я посмотрел на ваш spdlog... извините, это, мягко говоря, не готово к серьёзному применению:

1. Уровней логгирования тупо недостаточно. Как минимум, пропущен notice (должен быть между info и warning) — это уровень, на который должны реагировать роботы, но ещё не обязательно человек (в отличие от warning, который должен просматриваться админом периодически).
Ладно, в log4cplus такого тоже нет. Но там уровни идут с шагом 10000, и можно свои промежуточные ввести. Тут — info=2, warn=3, встроиться негде.
Точно так же, для серьёзного применения нужно несколько уровней дебага (минимум 3) и трассировки (минимум 2).

2. Где конфиг? Настраивать всё в коде?

3. Смешно. Подобное должно быть по умолчанию.

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

В плюс — больше одного именованного логгера (у совсем песочных и этого нет). Но сейчас этого мало.
]
The God is real, unless declared integer.
Re[4]: Сервисы в Linux
От: AlexGin Беларусь  
Дата: 11.07.20 08:55
Оценка:
Здравствуйте, netch80, Вы писали:
...
Спасибо, за столь развернутый ответ, уважаемый netch80!

Я может и подумаю о чём-то другом в качестве логера,
но в плане ухода от "демона" к "консольке" — вариант толковый!
Re[4]: Сервисы в Linux
От: Sheridan Россия  
Дата: 17.07.20 06:06
Оценка: 2 (1)
Здравствуйте, Reset, Вы писали:

R>Расскажи реальный практичный конкретный пример, когда это нужно (разработка под Астру — это для меня не реальный случай, поддержка RedHat5 тоже за гранью реальности).


В Астре — системд
Matrix has you...
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.