-1

Я получил программу в CentOS, которая записывает свой журнал в файл. Когда я переименовываю его, программа все равно пишет в него. Есть ли способ изменить этот дескриптор файла без перезапуска программы?

1 ответ1

2

Каким-то образом процесс все еще записывает в файл, хотя я переименовал его.

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

Проще говоря, схема журналирования вашей программы (если это действительно так и есть) является софоморной. Вы точно понимаете, почему это софомора. Этот файл будет расти и расти вечно, пока программа, генерирующая журнал, продолжает работать, пока она не израсходует все дисковое пространство, доступное пользователю, от имени которого она работает. (Небеса помогут вам, если ваша программа работает от имени суперпользователя.) Если кто-то отменяет связь с файлом, программа продолжает использовать пространство на диске бесконечно, поскольку файл продолжает существовать на диске без имени, пока не будет закрыт последний дескриптор открытого файла. И невозможно повернуть файл журнала или сбросить позицию файла дескриптора открытого файла извне самой программы. Так что даже усечение не работает, потому что программа продолжает писать с последней позиции, как обнаружил этот человек.

Теперь вы ничего не можете сделать, если не подключите отладчик, пока программа не завершится. В следующий раз скажите вашей программе, чтобы она регистрировала свою стандартную ошибку или стандартный вывод, если это вообще возможно. Затем отправьте эту стандартную ошибку / стандартный вывод через канал в программу, такую как multilog, multilog, s6-log, svlogd, tinylog или cyclog. Вы получите ограниченный по размеру, автоматически циклически изменяемый набор файлов журналов с возможностью поворота по требованию.

В следующий раз плохое действие - открыть файл в режиме добавления. Вам придётся копаться с копированием и усечением журнала, потому что вращение путем переименования файла все равно не будет работать; и, конечно, это может привести к потере данных журнала, как говорится на странице руководства logrotate , из-за окна возможности между копированием и усечением файла. Вышеупомянутые инструменты ведения журнала, напротив, не теряют данные журнала в непредсказуемых точках из-за ротации журналов, таких как newsyslog или logrotate (который не нужен и не используется). Используйте их вместе с супервизором процессов, который поддерживает канал открытым, и они даже не теряют данные журнала, когда кто-то перенастраивает и перезапускает регистратор на лету.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .