sigpending() | sigprocmask() | sigqueue() |
sigset() | sigsuspend() | sleep() |
socket() | socketpair() | stat() |
symlink() | sysconf() | tcdrain() |
tcflow() | tcflush() | tcgetattr() |
tcgetpgrp() | tcsendbreak() | tcsetattr() |
tcsetpgrp() | time() | timer_getoverrun() |
timer_gettime() | timer_settime() | times() |
umask() | uname() | unlink() |
utime() | wait() | wait3() |
wait4() | waitpid() | write() |
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, сделать запись об этом и продолжить */