Устанавливаемые демоны Linux, как их создать в C ++? - PullRequest
2 голосов
/ 20 апреля 2011

Устанавливаемые демоны Linux, как их создавать в C ++?

У меня есть серверное приложение на C ++, которое я хочу, чтобы оно работало так же, как служба Windows. Т.е. он должен запускаться всякий раз, когда система запускается независимо от того, вошел ли пользователь в систему или нет. В Windows существует множество классов C ++, способных облегчить взаимодействие с диспетчером служб и обработать команды start / stop / pause. А как насчет Linux? Также, как я могу легко развернуть свое приложение? Я завидую тому, как некоторые приложения устанавливаются с помощью системной команды apt-get, это так просто сделать с пользовательским приложением, скажем, я предоставляю двоичные файлы на одной машине, а затем автоматически извлекаю их из целевой Linux ...? 1003 *

Заранее благодарю за помощь.

Ответы [ 4 ]

8 голосов
/ 20 апреля 2011

Хорошо, во-первых, вам нужно знать, что службы записи в Windows и Linux очень разные.Во-первых, в Linux «сервисы» не называются «сервисами», они называются «демонами».Зная это, вы можете использовать Google, чтобы найти этот чрезвычайно полезный документ .

Что касается запуска / остановки / перезапуска, здесь нет универсального готового решения.В большинстве случаев демоны создают файлы * .pid в / var / run;эти файлы содержат свои идентификаторы процесса "PID".Затем пишется простой bash-скрипт, который управляет выполнением демона, читая pid из соответствующего файла и отправляя ему сигнал уничтожения.

Например, предположим, что имя вашего демона - foo.Затем он создаст файл /var/run/foo.pid и запишет в него свой PID, используя символы ASCII и добавив новую строку в конце.Ваше имя сценария управления будет fooctl, оно должно поддерживать следующие команды: запуск, остановка и перезапуск.То есть, когда вы запускаете fooctl start, сценарий должен сначала проверить, существует ли соответствующий файл pid, если нет, то сделать все необходимое для запуска демона;когда вы запускаете fooctl stop, он должен прочитать pid из /var/run/foo.pid и завершить процесс с этим ID.В случае fooctl restart ваш сценарий должен будет сначала остановить демон, а затем запустить его снова.

При этом, как говорится, это всего лишь соглашение о том, как должны работать демоны.Вот как это обычно делается.Но эти правила никак не соблюдаются.Вы можете изобретать и использовать свои собственные методы для создания и управления демонами.

Что касается второй части вашего вопроса (о apt-get), это называется управлением пакетами.Это не имеет ничего общего с демонами, но поскольку вы просили: чтобы сделать это с вашим пользовательским приложением, вам нужно будет опубликовать его в главном репозитории, что может быть невозможно по ряду причин;или вы можете создать свой собственный репо.Также вы можете собрать пакет * .deb для вашего приложения, и его будет так же просто установить.Поиск в Интернете для получения дополнительной информации о том, как создавать пакеты для пользовательских приложений Linux.

0 голосов
/ 04 января 2016

Попробуйте по этой ссылке . В ней содержится запись AZ-демона.

Прежде всего вам понадобятся следующие пакеты, установленные на вашем компьютере Linux для разработки демонов, в частности:

GCC 3.2.2 или выше и Заголовки и библиотеки Linux Development

#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <syslog.h>
#include <string.h>

int main(void) {

        /* Our process ID and Session ID */
        pid_t pid, sid;

        /* Fork off the parent process */
        pid = fork();
        if (pid < 0) {
                exit(EXIT_FAILURE);
        }
        /* If we got a good PID, then
           we can exit the parent process. */
        if (pid > 0) {
                exit(EXIT_SUCCESS);
        }

        /* Change the file mode mask */
        umask(0);

        /* Open any logs here */        

        /* Create a new SID for the child process */
        sid = setsid();
        if (sid < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }



        /* Change the current working directory */
        if ((chdir("/")) < 0) {
                /* Log the failure */
                exit(EXIT_FAILURE);
        }

        /* Close out the standard file descriptors */
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);

        /* Daemon-specific initialization goes here */

        /* The Big Loop */
        while (1) {
           /* Do some task here ... */

           sleep(30); /* wait 30 seconds */
        }
   exit(EXIT_SUCCESS);
}
0 голосов
/ 20 апреля 2011

Деймоны - это процесс, подобный другим.За исключением того, что у них нет родителя (или их родитель - процесс 0), ни идентификатора группы, ни идентификатора сеанса.Ричард Стивенс (чье Расширенное программирование в среде Unix все еще рекомендуется, когда вы занимаетесь системным программированием под Unix), дает эту функцию как способ настройки:

if ( (pid = fork()) < 0) {
    return -1;
else if (pid == 0) {
    exit(0);

setsid();
chdir("/");
umask(0);

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

Тогда возникает проблема управления демоном.Некоторые соглашения являются общими (но не универсальными):

- writing its pid in a file under /var/run/
- handling SIGHUP as a way to reread its configuration file
- using the syslog system to log messages

В дистрибутивах Linux также есть общие способы управления демонами.Обычно они обрабатываются с помощью сценариев, установленных вместе с deamon, которые переводят соглашения о распространении в то, что именно используется deamon.

0 голосов
/ 20 апреля 2011

В linux, daemon - это, по сути, программа без интерфейса.У него нет особых отличий в коде.Создание программы для автоматического запуска в качестве демона, к сожалению, выполняется по-разному в разных дистрибутивах.Для Ubuntu читайте о уровнях запуска и системе upstart / plymouth.Вы должны создать файл пакета, который выполняет настройку для вас, а не программы.

...