Свободное место на диске из файла журнала JBoss, который все еще записывается в

Существует ли какая-либо блокировка содержимого, наложенная процессом, если на этом процессе используется файл.

Мы размещаем сервер приложений JBoss на ОС RHEL 6.4, и из-за ограничений на дисковое пространство мы решили удалить файлы журнала, сгенерированные до даты.

Однако, если мы удалим файл журнала, который используется, может быть несколько проблем с протоколированием в jboss, что в конечном итоге приведет к перезапуску экземпляра Jboss App Server.

Мы решили аннулировать server.log который динамически записывается процессом сервера приложений JBoss (проверяется командой fuser ) с помощью следующих команд:

 -- > server.log -- echo "" > server.log 

Ни одна из вышеперечисленных команд не работала. Размер файлов по-прежнему показывает 500+ МБ

Как удалить содержимое файла без удаления файла?

    У Linux только кооперативные блокировки. Ничто не помешает процессу открыть файл, который имеет разрешение на открытие. Вам нужно будет вызвать механизм блокировки во всех процессах, используя файл, чтобы предотвратить параллельный доступ. Тем не менее, что вы пытаетесь сделать, не имеет никакого отношения к параллельному доступу, насколько я могу судить.

    Если вы удалите файл, открытый в процессе, файл фактически не удаляется: только его имя удаляется. Сам файл фактически удаляется только тогда, когда он больше не имеет никакого имени (нулевая жесткая ссылка), и он больше не открыт. Поэтому, если вы запустите rm server.log то время как приложение JBoss все еще открыто, это не освободит место на диске до тех пор, пока приложение JBoss не будет перезапущено (или закрывает файл журнала по какой-либо другой причине).

    Если вы запустите > server.log или echo "" > server.log , это echo "" > server.log файл до 0 или 1 байт соответственно, поэтому пространство на диске будет освобождено. Если приложение JBoss записывалось в файл, оно будет записывать в том же месте, 500 + МБ в файл. Это приводит к разреженному файлу , в котором файл содержит нулевые байты до позиции, где приложение начало писать на него. Например, если файл был 500 МБ, когда вы его усекали, и приложение продолжало писать 1 МБ, тогда размер файла составляет 501 МБ, но дисковое пространство, занимаемое файлом, составляет всего 1 МБ, а первый 500 МБ файла – это нулевые байты ,

    Если вы хотите, чтобы приложение записывалось в начале файла, вам нужно сказать ему, чтобы это сделать. Как правило, вы должны сообщить ему закрыть его текущий файл журнала и запустить новый. Как прокомментировал grebneke : см. Как очистить server.log в JBoss?

    Вы можете заблокировать файл в явном виде процессом (и владельцем блокировки – другие могут ждать выхода или сдаться).

    Для начала, проверьте flock и lockf . Файловые блокировки могут даже определять диапазоны внутри файлов.

    Ссылка, которая также решает некоторые проблемы с многопоточными и попытками решения.

    http://lwn.net/Articles/586022/