12.5. Повторное открытие журнальных файлов
12.5. Повторное открытие журнальных файлов
Большинство системных демонов ведут журнальные файлы, записывая в них все, что они делают. Поскольку многие системы Unix месяцами работают без остановки, эти журнальные файлы могут стать достаточно большими. Простое периодическое удаление (или переименование) журнальных файлов — не самое хорошее решение, потому что демоны будут продолжать записывать в эти файлы, несмотря на их недоступность, а необходимость останавливать и запускать каждый демон для очистки журнальных файлов приводит к недоступности системы (хоть и на незначительное время). Общий способ для демонов справиться с упомянутой ситуацией — перехватывать SIGHUP и повторно открывать журнальные файлы. Это позволяет организовать ротацию журналов (периодическое открытие новых журнальных файлов при сохранении старых), используя простой сценарий вроде приведенного ниже.
dd /var/log
mv messages messages.old
killall -HUP syslogd
Logrotate (ftp://ftp.redhat.com/pub/redhat/code/logrotate/) — одна из программ, которая использует преимущество такого метода для выполнения безопасной ротации журналов.
Включение этой возможности у большинства демонов достаточно просто. Одним их наиболее легких подходов является использование глобальной переменной, которая индицирует необходимость повторного открытия журналов.
Затем обработчик сигнала SIGHUP в своем вызове устанавливает эту переменную, и главная часть программы проверяет эту переменную насколько можно часто. Ниже приведен пример соответствующей программы.
1: /*sighup.c*/
2:
3: #include <errno.h>
4: #include <signal.h>
5: #include <stdio.h>
6: #include <string.h>
7: #include <unistd.h>
8:
9: volatile int reopenLog = 0; /* volatile - поскольку модифицируется
10: обработчиком сигнала */
11:
12: /* записать строку в журнал */
13: void logstring(int logfd, char *str) {
14: write(logfd, str, strlen(str));
15: }
16:
17: /* когда приходит SIGHUP, сделать запись об этом и продолжить */
18: void hupHandler(int signum) {
19: reopenLog = 1;
20: }
21:
22: int main() {
23: int done = 0;
24: struct sigaction sa;
25: int rc;
26: int logfd;
27:
28: logfd = STDOUT_FILENO;
29:
30: /* Установить обработчик сигнала SIGHUP. Использовать memset() для
31: инициализации структуры sigaction чтобы обеспечить очистку
32: всего. */
33: memset(&sa, 0, sizeof(sa));
34: sa.sa_handler = hupHandler;
35:
36: if (sigaction(SIGHUP, &sa, NULL)) perror("sigaction");
37:
38: /* Записывать сообщение в журнал каждые две секунды, и
39: повторно открывать журнальный файл по требованию SIGHUP */
40: while (!done) {
41: /*sleep() возвращает не ноль, если не спит достаточно долго*/
42: rc = sleep(2);
43: if (rc) {
44: if (reopenLog) {
45: logstring(logfd,
46: "* повторное открытие журналов по запросу SIGHUP ");
47: reopenLog = 0;
48: } else {
49: logstring(logfd,
50: "* sleep прервано неизвестным сигналом "
51: "--dying ");
52: done=1;
53: }
54: } else {
55: logstring(logfd, "Периодическое сообщение ");
56: }
57: }
58:
59: return 0;
60: }
Чтобы протестировать эту программу, запустите ее в одном окне xterm и отправьте сигнал SIGHUP из другого. Для каждого сигнала SIGHUP, который принимает программа, она печатает сообщение, когда выполняет нормальную ротацию своих журналов. Помните, что если сигнал поступает в тот момент, когда работает другой экземпляр обработчика, доставляется только один экземпляр сигнала, поэтому не отправляйте их слишком часто.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
4.4.2. Открытие и закрытие файлов
4.4.2. Открытие и закрытие файлов Новые дескрипторы файлов получают (наряду с другими источниками) в результате системного вызова open(). Этот системный вызов открывает файл для чтения или записи и возвращает новый дескриптор файла для последующих операций с этим файлом. Мы
11.2.3. Открытие файлов в файловой системе
11.2.3. Открытие файлов в файловой системе Хотя Linux предусматривает множество типов файлов, обычные файлы используются наиболее часто. Программы, конфигурационные файлы, файлы данных — все они подпадают под это определение, и многие приложения не могут (явно) использовать
Открытие и загрузка файлов по magnet-ссылкам
Открытие и загрузка файлов по magnet-ссылкам Но программа DC++ имеет еще одно неоспоримое преимущество: вы можете переслать свой файл конкретному пользователю. Вернее, предоставить возможность скачать вашему знакомому нужный ему в данный момент файл. Согласитесь, крайне
3.6. Повторное использование идентификаторов
3.6. Повторное использование идентификаторов Структура ipc_perm (раздел 3.3) содержит переменную seq, в которой хранится порядковый номер канала. Эта переменная представляет собой счетчик, заводимый ядром для каждого объекта IPC в системе. При удалении объекта IPC номер канала
7.4. Повторное использование
7.4. Повторное использование Элементы повторного использования Любой программный продукт (текст программы, архитектура, сценарий или документация) может быть использован повторно. Как сказано в главе 3, в объектно-ориентированных языках программирования первичным
10.1.1. Открытие и закрытие файлов
10.1.1. Открытие и закрытие файлов Метод класса File.new, создающий новый объект File, также открывает файл. Первым параметром, естественно, является имя файла.Необязательный второй параметр называется строкой указания режимам он говорит, как нужно открывать файл — для чтения,
Высокоуровневое открытие файлов
Высокоуровневое открытие файлов Функции открытия потока возвращают указатель на тип FILE (этот указатель называют также указателем потока), этот указатель используется при дальнейших обращениях к
Открытие файлов
Открытие файлов Файл должен быть открыт функциями open, sopen или creat до выполнения первой операции ввода или вывода с использованием функций нижнего уровня для этого файла.Файл может быть открыт для чтения, записи, или для чтения и записи, может быть открыт в текстовом или в
11.3.3. Повторное возбуждение исключения
11.3.3. Повторное возбуждение исключения Может оказаться так, что в одном предложении catch не удалось полностью обработать исключение. Выполнив некоторые корректирующие действия, catch-обработчик может решить, что дальнейшую обработку следует поручить функции, расположенной
Открытие файлов по умолчанию
Открытие файлов по умолчанию Стоит обратить особое внимание на класс Process. С помощью данного класса очень удобно запускать любой файл, который будет открываться программой, сопоставленной с данным типом файла. Предположим, что необходимо воспроизвести музыкальный файл
Открытие и создание файлов
Открытие и создание файлов После создания объекта класса CFile можно открыть файл, вызвав метод Open. Методу Open надо указать путь к открываемому файлу и режим его использования. Прототип метода Open имеет следующий вид:virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);В качестве
8.3.3 Открытие Файлов
8.3.3 Открытие Файлов Точные детали того, как открываются и закрываются файлы, различаются в разных операционных системах и здесь подробно не описываются. Поскольку после включения «stream.h» станвятся доступны cin, cout и cerr, во многих (если не во всех) программах не нужно держать
26.1.1. Применение команды date для создания журнальных файлов
26.1.1. Применение команды date для создания журнальных файлов Если возникла необходимость создать журнальный файл, желательно сделать его уникальным. Для этого достаточно воспользоваться командой date. Командой date можно манипулировать, а также добавлять ее к имени файла,
Повторное использование (Reusability)
Повторное использование (Reusability) Определение: повторное использованиеПовторное использование есть способность элементов ПО служить для построения многих различных приложений. Необходимость и возможность повторного использования возникает из наблюдений сходства
Повторное использование персонала
Повторное использование персонала Наиболее просто повторно использовать разработчиков, что широко практикуется в промышленности. Переводя разработчиков ПО с одного проекта на другой, фирмы избегают потери накопленного ими ранее опыта и обеспечивают его достойное
Типизация и повторное объявление
Типизация и повторное объявление Повторное объявление компонентов не требует сохранения сигнатуры. Пока оно виделось нам как замена одного алгоритма другим или - для отложенного компонента - запись алгоритма, соответствующего ранее заданной спецификации.Но, воплощая