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

837
zogby

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

-1
Пожалуйста [отредактируйте] свой вопрос и дайте более подробную информацию. Что это за процесс? Это сценарий? Можете ли вы сделать переименование в скрипте / программе? Зачем вам нужно переименовывать файл, в который вы пишете? Как именно этот процесс записывает в файл? terdon 10 лет назад 1
Можете ли вы сделать переименование в скрипте / программе? - Нет, я не могу. Почему вам нужно переименовать файл, в который вы пишете? - Мне срочно нужно сделать резервную копию файлов журнала, но я не могу остановить процесс записи в них. zogby 10 лет назад 0
Пожалуйста, _ [редактировать] _ ваше сообщение, чтобы добавить новую информацию, это трудно прочитать и легко пропустить в комментариях. Это до сих пор неясно. Если вам нужна резервная копия, просто скопируйте файл в другое место, не нужно ничего останавливать. Если вы переименуете его, как процесс все еще пишет в него? Это именованная труба? Жесткая ссылка? Мы не сможем вам помочь, если вы не добавите более подробную информацию ([отредактировав] свой вопрос). terdon 10 лет назад 0
@terdon Извините, я не понимаю, что неясно. Каким-то образом процесс все еще записывает в файл, хотя я переименовал его. Мне нужно создать резервную копию из этого файла журнала и очистить этот файл журнала. zogby 10 лет назад 0
Вы только что упомянули, что вам нужно удалить файл. Вы не объяснили, почему простого `mv logfile logfile.bak` недостаточно. Вы хотите сказать, что процесс будет продолжать писать в `logfile.bak`? Насколько я знаю, это невозможно. Он просто воссоздаст файл журнала и продолжит писать на него. Если все это не так, вам нужно точно сказать нам, какой процесс и какая файловая система, и привести воспроизводимый пример, потому что вы описываете что-то чрезвычайно странное. terdon 10 лет назад 0

1 ответ на вопрос

2
JdeBP

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

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

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

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

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

Похожие вопросы