powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
25 сообщений из 368, страница 6 из 15
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006062
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Мне цикл не нравится в моей программе службе без ГУИ
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006063
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev
Даже не знаю кому может понадобиться служба с пустым циклом, внутри которого ничего кроме загрузки процессора не происходит...
Если это какой-то TCP сервер, то в цикле, к примеру, может находится опрос сокетов - какая-то полезная нагрузка, отвечающая решаемым службой задачам.
консрльное подписывается на событие от главной ИС.
Логично?
Как без цикла?
Наверное ты хотел спросить как без пустого цикла, который ничего не делает? Элементарно!
Службы, как правило, обрабатывают приходящие им сигналы. Часть сигналов можно отправить на свой "автоматический" обработчик - handler, который отрабатывает по callback'у, а часть обрабатывать "вручную" - в цикле основного потока, для чего в этом цикле вешается sigwait(), результатом которого является номер обрабатываемого вручную сигнала. К примеру, ты можешь указать, что хочешь обрабатывать сигналы SIGHUP, SIGTERM, SIGQUIT данным способом и тогда, при появлении этих сигналов, sigwait() будет вываливаться с результатом signo.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006064
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Ты все рассказал про обработку сигналов unix системных.
Мне они не нужны.
Более высокий уровень. Прикладной код.
Класс подписывается и будет вызвана функция по каллбэку или адресу.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006068
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp, а как на счёт штатного завершения твоей службы при получении сигнала от systemctl restart my.service ? Непредусмотрено? Просто киляем процесс и всё?
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006070
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Это позже. Это рюшечки.
Счас идеальнобыло бы спящий процесс без цикла и он пробудился по какому либо признаку.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006071
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Еще хорошо бы при поступлении message показать его в systree.
Но тоже позже. Не уверен что это нужно в этом же процессе фоновом демона.
Пока можно в логах смотреть.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006073
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
То есть модель желательно такая
- не демон опрашивает, а демон подписывается на....
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006075
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
PetroNotC Sharp, а как на счёт штатного завершения твоей службы при получении сигнала от systemctl restart my.service ? Непредусмотрено? Просто киляем процесс и всё?
кстати, это вроде уже работает из коробки.
И старт стоп вроде есть.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006080
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev,
То есть модель желательно такая
- не демон опрашивает, а демон подписывается на....
А что значит "подписывается"? Если ты используешь msgsnd/msgrcv, то msgrcv это по-любому блокируемый или неблокируемый(IPC_NOWAIT) вызов функции, для получения сообщения из очереди и эту функцию тебе надо крутить в цикле. Вот тебе и нагрузка для цикла! Сделай вызов msgrcv блокируемым и пусть реализация этой функции ждёт сообщения, чтобы не крутить постоянный опрос очереди внутри службы.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006081
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev
PetroNotC Sharp, а как на счёт штатного завершения твоей службы при получении сигнала от systemctl restart my.service ? Непредусмотрено? Просто киляем процесс и всё?
кстати, это вроде уже работает из коробки.
И старт стоп вроде есть.
В Linux "из коробки" вообще мало что работает. Процесс будет тупо прибит, что даже мяукнуть не успеет.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006082
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
который точно также отрабатывает (запускает дочерний процесс через fork()) и завершается.
Хорошо, попробую и вам разжевать
Код: plaintext
1.
2.
3.
4.
5.
6.
   Loaded: loaded (/usr/lib/systemd/system/firebird-superserver.service; ...
   Active: active (running) since Wed 2020-10-07 16:31:12 +08; 10min ago
  Process: 761 ExecStart=/opt/firebird/bin/fbguard -daemon -forever (code=exited, status=0/SUCCESS)
 Main PID: 765 (fbguard)
   CGroup: /system.slice/firebird-superserver.service
           ├─765 /opt/firebird/bin/fbguard -daemon -forever
           └─766 /opt/firebird/bin/firebird

systemd стартовал fbguard (pid 761), который "подготовился к демонизации", fork-нулся, (как-то) проверил статус потомка (pid 765) и родительский процесс fbguard (успешно) завершился.
Всё это время systemd ожидал демонизации fbguard и "взял на контроль" дочерний (pid 765) процесс fbguard.

systemd "видит", что fbguard запустил ещё один процесс (firebird, pid 766), но состояние этого процесса-потомка systemd не контролирует. Отсутствие контроля легко проверить, сделав, например:
Код: plaintext
 sudo kill `pgrep firebird`
systemd отобразит новый процесс, но состояние сервиса останется прежним (с fbguard ничего не происходило).

Делаем:
Код: plaintext
1.
2.
Type=simple
ExecStart=/opt/firebird/bin/firebird
Restart=on-failure

Активируем изменения, перезапускаем сервис и смотрим статус:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
sudo systemctl daemon-reload
sudo systemctl restart firebird-superserver
systemctl status firebird-superserver
...
   Active: active (running) since Wed 2020-10-07 16:56:21 +08; 12s ago
 Main PID: 1063 (firebird)
   CGroup: /system.slice/firebird-superserver.service
           └─1063 /opt/firebird/bin/firebird

Вполне очевидно, что демонизацию процесса выполнил сам systemd и что он "следит" за напрямую целевым процессом. В частности, будет перезапускать процесс и устанавливать статус сервиса.
В качестве побочного эффекта будут потеряны записи fbguard в firebird.log. Этакий "windows-style".

Так вот - oneshot это подмножество simple, в котором systemd только выполняет демонизацию, но никак не заботится о завершении процесса и не реагирует на код ошибки завершённого процесса.

P.S.
Ах, да - директива PIDFile отсутствует в обоих вариантах юнита.

P.P.S.
Как сделать simple для fbguard - оставляется в качестве домашнего упражнения.
Ещё полезно подумать, что будет, если взять файл, который самостоятельно демонизируется и сделать из него simple-юнит, а потом - oneshot-юнит.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006083
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Я не понял. Чем поможет сигнал, если все равно мой цикл
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
int main()
{
	signal(SIGINT, sig_handler1);
	while(1)
	{
		printf("Hello\n");
		sleep(
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006086
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
В Linux "из коробки" вообще мало что работает. Процесс будет тупо прибит, что даже мяукнуть не успеет.
Вы бы эта, документацию бы, что ли, почитали ....
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006087
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
PetroNotC Sharp
rdb_dev,
То есть модель желательно такая
- не демон опрашивает, а демон подписывается на....
А что значит "подписывается"? Если ты используешь msgsnd/msgrcv, то msgrcv это по-любому блокируемый или неблокируемый(IPC_NOWAIT) вызов функции, для получения сообщения из очереди и эту функцию тебе надо крутить в цикле. Вот тебе и нагрузка для цикла! Сделай вызов msgrcv блокируемым и пусть реализация этой функции ждёт сообщения, чтобы не крутить постоянный опрос очереди внутри службы.

Думаю подписчик модуль-классА заказчика вешается на порт и мониторит его. При поступлении message он каллбэком вызывает меня.
Вся кухня внутри классаА.
Зачем тут мой цикл?
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006089
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
PetroNotC Sharp
пропущено...
кстати, это вроде уже работает из коробки.
И старт стоп вроде есть.
В Linux "из коробки" вообще мало что работает. Процесс будет тупо прибит, что даже мяукнуть не успеет.

Бездоказательно.
Что мешает утилите systemctl послать все сигналы типа Приготовиться.... процессу?
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006091
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov, ничего нового... Всё это мы уже обсудили:
22209583
22209769
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006093
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Идеально мне надо
Код: plaintext
1.
2.
3.
4.
int main()
{
      ClassA a = new ClassA(адресКаллбэкФункцииТуточки) ;
	//while(1)
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006094
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev
пропущено...
В Linux "из коробки" вообще мало что работает. Процесс будет тупо прибит, что даже мяукнуть не успеет.

Бездоказательно.
Что мешает утилите systemctl послать все сигналы типа Приготовиться.... процессу?
И как процесс должен эти сигналы обработать?
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006096
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Слушай, обработать сигнал ТебяСчасГрохнут или плевать на него - дело программиста.
Напишет освободить ресурс - освободится.
Не напишет, Ось освободит как в винде вместе с процессом.
Неверно говорить что процесс грохают методом вилки из розетки.
Имхо
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006097
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev,
Идеально мне надо
Код: plaintext
1.
2.
3.
4.
int main()
{
      ClassA a = new ClassA(адресКаллбэкФункцииТуточки) ;
	//while(1)

Так напиши подобный класс! В чём проблема?
Конечно, ты можешь порыскать на просторах гитхаба и, возможно, найдёшь там уже кем-то реализованную класс-обёртку или даже целую библиотеку-обёртку, если не надеешься на собственные силы и считаешь, что сделаешь это хуже, чем кто-либо.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006099
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Класс уже есть блин!
Как цикл убрать?
Или после return 0
Будет каллбэк работать?
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006100
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
rdb_dev,
Класс уже есть блин!
Как цикл убрать?
Никак!
Сделай классу метод ListenEvents, который будет в цикле крутить msgrcv() и вызывать твою callback функцию. Так или иначе без подобных циклов не обходится даже в венде, просто они скрыты за реализацией соответствующих библиотечных функций. Другое дело, что они там могут быть реализованы намного грамотнее, чем сделало бы большинство начинающих программистов.

PetroNotC Sharp
Или после return 0
Будет каллбэк работать?
Нет, не будет. Возврат из main() приводит к завершению процесса, это же очевидно!
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006101
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Я понял.
while(1)+sleep(1) оптимально для данной задачи как усыпить процесс.
Класс уже написан, и убирать цикл внутрь него нет необходимости. Он и в ГУИ прогах работает.
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006102
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Вот цикл номер два)))))
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
static volatile sig_atomic_t done_waiting = 0;

static void     handler()
{
  printf("Signal caught\n");
  done_waiting = 1;
}

void    my_pause()
{
  /**
   *  In ISO C, the signal system call is used
   *  to call a specific handler when a specified
   *  signal is received by the current process.
   *  In POSIX.1, it is encouraged to use the sigaction APIs.
   **/
  signal(SIGINT, handler);
  done_waiting = 0;
  while ( !done_waiting )
    ;
}

int     main()
{
  my_pause();
  printf("Hey ! The first call to my_pause returned !\n");
  my_pause();
  printf("The second call to my_pause returned !\n");
  return (0);
}
...
Рейтинг: 0 / 0
Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
    #40006104
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev,
Вместо цикла можно
pause()
?
...
Рейтинг: 0 / 0
25 сообщений из 368, страница 6 из 15
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как по новому пишется демон? systemd вместо init.d? fork() не нужен?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]