Изменить дескриптор при переименовании файла linux

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

1 ответ

Решение

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

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

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

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

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

Другие вопросы по тегам