sa.sa_flags = SA_RESTART;

sa.sa_handler = sighupHandler;

if (sigaction(SIGHUP, &sa, NULL) == –1)

errExit("sigaction");

if (becomeDaemon(0) == –1)

errExit("becomeDaemon");

logOpen(LOG_FILE);

readConfigFile(CONFIG_FILE);

unslept = SLEEP_TIME;

for (;;) {

 unslept = sleep(unslept); /* В случае прерывания возвращает значение > 0 */

 if (hupReceived) { /* При получении сигнала SIGHUP… */

logClose();

logOpen(LOG_FILE);

readConfigFile(CONFIG_FILE);

hupReceived = 0; /* Готовимся принять следующий сигнал SIGHUP */

}

if (unslept == 0) { /* Когда интервал исчерпан */

count++;

 logMessage("Main: %d", count);

unslept = SLEEP_TIME; /* Сбрасываем интервал */

}

}

}

daemons/daemon_SIGHUP.c

37.5. Запись в журнал сообщений и ошибок с помощью системы syslog

При написании демона одной из проблем является вывод сообщений об ошибках. Поскольку демон выполняется в фоновом режиме, он не может выводить информацию в терминале, как это делают другие программы. В качестве альтернативы сообщения можно записывать в отдельный журнальный файл программы (см. листинг 37.3). Основной недостаток такого подхода (с точки зрения системного администратора) заключается в сложности управления журнальными файлами разных приложений и их мониторинге. Для решения этой проблемы была разработана система syslog.

37.5.1. Краткий обзор

Система syslog предоставляет единый централизованный механизм, который позволяет любому приложению на компьютере записывать свои сообщения в журнал. Общая структура syslog показана на рис. 37.1.

Система syslog состоит из двух основных компонентов: демона syslogd и библиотечной функции syslog(3).

Демон System Log, syslogd, принимает журнальные сообщения из двух разных источников: сокета UNIX-домена (/dev/log), который хранит сообщения, сгенерированные локально, и (если включено в конфигурации) сокет интернет-домена (UDP-порт 514), которые хранит сообщения, отправленные по сети TCP/IP (в некоторых системах UNIX сокет syslog находится в каталоге /var/run/log).

Рис. 37.1. Принцип работы системного журнала

Каждое сообщение, обработанное syslogd, имеет набор атрибутов, включая категорию, которая определяет тип программы, сгенерировавшей сообщение, и уровень, обозначающий значимость (приоритет) этого сообщения. Демон syslogd проверяет категорию и уровень всех сообщений, передавая их в несколько возможных мест, которые определяются соответствующим конфигурационным файлом, /etc/syslog.conf. Среди адресатов могут быть терминал или виртуальная консоль, файл на диске, очередь FIFO, один или несколько пользователей в системе (или сразу все) или процесс (обычно другой демон syslogd) на другом компьютере, подключенный по сети TCP/IP (передача сообщений процессу в другой системе используется для их сбора на едином компьютере, что приводит к упрощению администрирования). Одно сообщение можно послать нескольким адресатам (или вовсе никому), а сообщения с разными категориями и уровнями могут быть направлены разным получателям или их экземплярам (то есть разным консолям, файлам на диске и т. д.).

Передача syslog-сообщений другому компьютеру по протоколу TCP/IP может также помочь обнаружить несанкционированное проникновение в систему. Взломщики часто оставляют следы в системном журнале, и обычно они пытаются их стереть, чтобы скрыть свою деятельность. В случае с удаленным журналированием злоумышленнику пришлось бы для этого проникнуть еще и на другой компьютер.

Для записи сообщений в журнал любой процесс может воспользоваться библиотечной функцией syslog(3) (мы подробно опишем ее чуть ниже). На основе переданных ей аргументов она создает сообщение стандартного вида и помещает его в сокет /dev/log, где оно будет доступно для syslogd.

Альтернативной системой сбора сообщений является демон klogd (Kernel Log), который собирает журнальные записи ядра (ядро генерирует их с помощью своей функции printk()). Эти записи передаются через один из двух равнозначных интерфейсов (которые существуют только в Linux) — файл /proc/kmsg или системный вызов syslog(2) — после чего помещаются в сокет /dev/log с помощью библиотечной функции syslog(3).

Несмотря на одинаковые имена, вызовы 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.

Перейти на страницу:

Похожие книги