Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: [РЕШЕНО] старт/пауза/остановка демона  (Прочитано 1006 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Torvald3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Написал демон на с++, теперь возникла необходимость извне (с другой программы) его запускать, останавливать или выгружать. Подскажите пожалуйста, как это лучше сделать, мб есть какие то стандартные функции или дайте ссылки. Пока такая  задумка: с программы-управления писать в файл команду (например пауза), а с демона ее считывать. Но думаю это не правильно, не красиво и вообще по-индуски)
PS демон пишет в лог-файл клики мышки, вот код на всякий случай:
(Нажмите, чтобы показать/скрыть)
« Последнее редактирование: 14 Июнь 2011, 17:40:03 от RazrFalcon »
Программисты программировали программировали да не выпрограммировали

Оффлайн easy2002

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2786
  • Мурманск
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #1 : 12 Июнь 2011, 13:35:54 »
Подскажите пожалуйста, как это лучше сделать, мб есть какие то стандартные функции или дайте ссылки.
cat /etc/init.d/skeleton
Tempora mutantur et nos mutantur in illis

Оффлайн Lion-Simba

  • Старожил
  • *
  • Сообщений: 1126
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #2 : 12 Июнь 2011, 14:15:16 »
Upstart way:

Демонизацию из кода демона убрать:
  /* Наши ID процесса и сессии */
  pid_t pid, sid;

  /* Ответвляемся от родительского процесса */
  pid = fork();
  if (pid < 0) {
    exit(EXIT_FAILURE);
  }
  /* Если с PID'ом все получилось, то родительский процесс можно завершить. */
  if (pid > 0) {
    exit(EXIT_SUCCESS);
  }

  /* Изменяем файловую маску */
  umask(0);

  /* Здесь можно открывать любые журналы */

  /* Создание нового SID для дочернего процесса */
  sid = setsid();
  if (sid < 0) {
    /* Журналируем любой сбой */
    exit(EXIT_FAILURE);
  }

Затем создать файл /etc/init/mydaemon.conf
description "My super daemon"
author "Torvald3d <torvald@example.com>"

respawn

exec /path/to/my/super/daemon

После этого демона можно будет запускать/останавливать и проверять статус командами:
start mydaemon
stop mydaemon
status mydaemon

Если из файла убрать respawn, то в случае неожиданного падения демона, он НЕ будет автоматически перезапускаться.
Оказываю индивидуальную платную техподдержку широкого профиля. Обращаться в ЛС или Jabber.

Оффлайн Torvald3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #3 : 12 Июнь 2011, 15:07:00 »
Спасибо большое!
Программисты программировали программировали да не выпрограммировали

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #4 : 12 Июнь 2011, 17:01:41 »
log = fopen("/home/torvald/Документы/log.txt", "a");
вот то индусский код. так что за остальное не переживай ;)

Оффлайн Torvald3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #5 : 12 Июнь 2011, 18:10:56 »
:D и это тоже) мой первый демон как никак. Понял, что так делать не хорошо, когда посмотрел на график загрузки диска.
А как в данном случае лучше лог файл писать? Может записывать/считывать каждую секунду?
Программисты программировали программировали да не выпрограммировали

Оффлайн st_vladm

  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #6 : 13 Июнь 2011, 13:45:11 »
Я бы сделал кэш в памяти, например так. Заюзать multimap<time_t,int>. где int - код события (вместо текста события, для экономии памяти). Писать туда события до какого-то количества (подобрать эмпирически), а затем сбрасывать в лог-файл все сразу. Вместо кода события записывается строка из массива событий по индексу [int] из map-а, там же преобразуется time_t в строку времени. Так как за 1 с может быть несколько событий, неплохо проверять новое time_t на совпадение с предыдущим (при совпадении используем старую строку времени)- экономим еще и процессорные циклы.

Оффлайн Torvald3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #7 : 13 Июнь 2011, 14:46:54 »
Допустим у нас кэш на 100 событий. И пусть события происходят раз в минуту. В случае сбоя (электричество отключили) на 99-ом событии получаем потерю информации аж за полтора часа) Думаю лучше оставлю запись событий каждую секунду, не такая уж и большая при этом нагрузка на винт.
Программисты программировали программировали да не выпрограммировали

Оффлайн st_vladm

  • Новичок
  • *
  • Сообщений: 32
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #8 : 13 Июнь 2011, 15:43:23 »
Если события происходят раз в минуту, то нечего и огород городить. Можно каждое событие писать на диск сразу, ощутимой нагрузки ни на винт, ни на процессор это не создаст. По Вашему посту я понял, что событий как раз очень много и происходят они очень часто, чаще раза в секунду. Можно, кстати, сделать и комбинированный триггер записи - чтобы срабатывал или от объема буфера, или от таймаута.

Оффлайн Torvald3d

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: старт/пауза/остановка демона
« Ответ #9 : 14 Июнь 2011, 17:18:10 »
Точно! комбинация.
А вообще я рассматривал общий вариант - события могут быть разными и разнообразными)
Всем спасибо, вопрос решен.
Программисты программировали программировали да не выпрограммировали

 

Страница сгенерирована за 0.054 секунд. Запросов: 24.