Мне кажется, я понимаю это сейчас.HUP заставляет rsyslogd закрыть свои открытые файлы, но не открывает файл до тех пор, пока ему не понадобится войти в него.Рассмотрим следующее: я использую inotify для ожидания закрытия файла, например:
case 9:
{
// Wait for the file, specified in argv[2], to be closed
int inotfd = inotify_init();
if (inotfd < 0) {
printf("inotify_init failed; errno %d: %s\n",
errno, strerror(errno));
exit(99);
}
int watch_desc = inotify_add_watch(inotfd, argv[2], IN_CLOSE);
if (watch_desc < 0) {
printf("can't watch %s failed; errno %d: %s\n",
argv[2], errno, strerror(errno));
exit(99);
}
size_t bufsiz = sizeof(struct inotify_event) + PATH_MAX + 1;
struct inotify_event* event = static_cast<inotify_event*>(malloc(bufsiz));
if (!event) {
printf("Failed to malloc event buffer; errno %d: %s\n",
errno, strerror(errno));
exit(99);
}
/* wait for an event to occur with blocking read*/
read(inotfd, event, bufsiz);
}
Затем в моем сценарии оболочки я жду этого:
# Start a process that waits for the log file be closed
${bin}/test_dump_hook.exe 9 "./dump_hook_log" &
wait_pid=$!
# Signal syslogd to cause it it close/reopen its log files
kill -HUP `cat /var/run/syslogd.pid` # flush syslog
if [ $? -ne 0 ]
then
logFail "failed to HUP `cat /var/run/syslogd.pid`: $?"
fi
wait $waid_pid
Я не нахожу этого никогдавозвращается.Отправка HUP в rsyslogd из другого процесса также не прерывает его ожидания, но это делает кошка (которая открывает / закрывает файл) файла журнала.
Это потому, что HUP в оболочкеСценарий был выполнен до того, как другой процесс ожидал его.Таким образом, файл был уже закрыт в начале ожидания, и поскольку больше не ведется запись в этот файл, он не открывается снова и не нуждается в закрытии при получении любых последующих HUP, поэтому событие никогда не завершается в ожидании..
Поняв это поведение, как я могу быть уверен, что журнал был записан до того, как я его проверил?Я пошел с этим решением;поместите известное сообщение в журнал и подождите, пока оно не появится, я знаю, что записи, которые я жду, должны быть до этого.Как это: -
function flushSyslog
{
logger -p user.info -t dump_hoook_test "flushSyslog"
# Signal syslogd to cause it it close its log file
kill -HUP `cat /var/run/syslogd.pid` # flush syslog
if [ $? -ne 0 ]
then
logFail "failed to HUP `cat /var/run/syslogd.pid`: $?"
fi
# wait upto 10 secs for the entry we've just logged to appear
sleeps=0
until
grep "flushSyslog" ./dump_hook_log > /dev/null
do
sleeps=$((sleeps+1))
if [ $sleeps -gt 100 ]
then
logFail "failed to flush syslog dump_hook_log"
fi
sleep 0.1
done
}