Tuesday, September 27, 2011

Пишем собственный linux демон с возможностью автовосстановления работы

Уважаемые хабрапользователи, хотелось бы поделиться с вами опытом написания серверных демонов. В Рунете очень много статей по этому поводу, но большинство из них не даёт ответы на такие важные вопросы как:

    Как добавить демона в автозагрузку?
    Что делать, если в процессе работы произошла ошибка и демон рухнул?
    Каким образом обновить конфигурацию демона без прерывания его работы?


В рамках данной части рассмотрим следующие моменты:

    Принцип работы демона.
    Основы разработки мониторинга состояния демона.
    Обработка ошибок при работе, с подробным отчетом в лог.
    Некоторые вопросы связанные с ресурсами системы.


Для наглядности будет показан исходный код следующих частей:

    Шаблон основной программы.
    Шаблон функции мониторинга работы демона.
    Шаблон функции обработки ошибок.
    Ряд вспомогательных функций.

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

    Демон должен сохранить свой PID в файл, для того чтобы потом можно было его корректно остановить.
    Необходимо выполнить ряд подготовительных операций для начала работы в фоновом режиме.


В нашей модели демон будет функционировать по следующему алгоритму:

    Отделение от управляющего терминала и переход в фоновый режим.
    Разделение на две части: родитель(мониторинг) и потомок(функционал демона).
    Мониторинг состояния процесса демона.
    Обработка команды обновления конфига.
    Обработка ошибок.

Шаблона программы.
Данный код будет осуществлять все действия, которые необходимы для удачного запуска демона.

    int main(int argc, char** argv)
    {
        int status;
        int pid;
       
        // если параметров командной строки меньше двух, то покажем как использовать демона
        if (argc != 2)
        {
            printf("Usage: ./my_daemon filename.cfg\n");
            return -1;
        }

        // загружаем файл конфигурации
        status = LoadConfig(argv[1]);


Read more: Habrahabr.ru
QR: https://chart.googleapis.com/chart?chs=80x80&cht=qr&choe=UTF-8&chl=http://habrahabr.ru/blogs/programming/129207/

Posted via email from Jasper-Net