sa.sa_flags = SA_RESTART;
sa.sa_handler = sighupHandler;
errExit("sigaction");
errExit("becomeDaemon");
unslept = SLEEP_TIME;
for (;;) {
logClose();
logOpen(LOG_FILE);
readConfigFile(CONFIG_FILE);
hupReceived = 0; /* Готовимся принять следующий сигнал SIGHUP */
}
if (unslept == 0) { /* Когда интервал исчерпан */
count++;
unslept = SLEEP_TIME; /* Сбрасываем интервал */
}
}
}
daemons/daemon_SIGHUP.c
При написании демона одной из проблем является вывод сообщений об ошибках. Поскольку демон выполняется в фоновом режиме, он не может выводить информацию в терминале, как это делают другие программы. В качестве альтернативы сообщения можно записывать в отдельный журнальный файл программы (см. листинг 37.3). Основной недостаток такого подхода (с точки зрения системного администратора) заключается в сложности управления журнальными файлами разных приложений и их мониторинге. Для решения этой проблемы была разработана система syslog.
37.5.1. Краткий обзор
Система syslog предоставляет единый централизованный механизм, который позволяет любому приложению на компьютере записывать свои сообщения в журнал. Общая структура syslog показана на рис. 37.1.
Система syslog состоит из двух основных компонентов: демона syslogd и библиотечной функции syslog(3).
Демон
Рис. 37.1.
Каждое сообщение, обработанное syslogd, имеет набор атрибутов, включая
Передача syslog-сообщений другому компьютеру по протоколу TCP/IP может также помочь обнаружить несанкционированное проникновение в систему. Взломщики часто оставляют следы в системном журнале, и обычно они пытаются их стереть, чтобы скрыть свою деятельность. В случае с удаленным журналированием злоумышленнику пришлось бы для этого проникнуть еще и на другой компьютер.
Для записи сообщений в журнал любой процесс может воспользоваться библиотечной функцией syslog(3) (мы подробно опишем ее чуть ниже). На основе переданных ей аргументов она создает сообщение стандартного вида и помещает его в сокет /dev/log, где оно будет доступно для syslogd.
Альтернативной системой сбора сообщений является демон klogd
Несмотря на одинаковые имена, вызовы syslog(2) и syslog(3) выполняют совсем разные задачи. Интерфейс syslog(2) предоставляется библиотекой glibc под именем klogctl(). При упоминании в этом разделе вызова syslog() обычно имеется в виду syslog(3) (если явно не указано противоположное).
Впервые средства syslog были представлены в системе 4.2BSD, но теперь они доступны в большинстве реализаций UNIX. Стандарт SUSv3 включает в себя вызов syslog(3) и другие связанные с ним функции, оставляя без внимания реализацию и поведение демона syslogd, а также формат файла syslog.conf. Версия syslogd, использующаяся в Linux, отличается от оригинальной тем, что предусматривает некоторые расширения правил обработки сообщений, которые могут быть указаны в файле syslog.conf.