Как работает logrotate, когда два процесса используют один и тот же файл? - PullRequest
2 голосов
/ 15 мая 2019

Например:

  1. Программа A записывает журнал в файл "test.log".

  2. Если запускается logrotate, он переименовываетсяСначала «test.log» - «test.log.1», а затем создайте новый файл «test.log».

После шага 2 программа A не сообщает об ошибке, но журнал A не появляется в новом файле "test.log".

Вопросы:

  1. Где находятся данные, которые A записывает в файл послешаг 2?

  2. Как войти в систему, переименовать и создать новый файл, когда другой файл записывает в файл?(Есть что-то, что я упускаю из-за logrotate?)

Спасибо!

1 Ответ

4 голосов
/ 15 мая 2019

Это очень тесно связано с работой файловых систем POSIX.Когда вы переименовываете файл, изменяется только имя файла, физический файл на диске не изменится.Кроме того, после открытия файла процесс, использующий этот файл, имеет только ссылку (через несколько слоев) на физический файл на диске, имя используется только при открытии файла.

Это означает, что программаA все равно будет записывать в тот же файл, который теперь имеет новое имя (например, test.log.1 в вашем примере).

Распространенным решением этой проблемы является передача программой ротации журналов сигнала (например, SIGHUP или SIGUSR1 или аналогичный) к процессу.Процесс обнаружит этот сигнал и затем снова откроет запись в журнал, чтобы использовать новый файл.

...