В Linux есть только кооперативные блокировки. Ничто не помешает процессу открыть файл, на открытие которого у него есть разрешение. Вам нужно будет вызвать механизм блокировки во всех процессах, использующих файл, чтобы предотвратить одновременный доступ. Однако то, что вы пытаетесь сделать, не имеет ничего общего с одновременным доступом, насколько я могу судить.
Если вы удаляете файл, открытый в процессе, файл на самом деле не удаляется: удаляется только его имя. Сам файл удаляется только тогда, когда у него больше нет имени (нулевая жесткая ссылка) и он больше не открыт. Поэтому если вы выполните rm server.log
, в то время как приложение JBoss все еще имеет его открытым, это не освободит место на диске, пока приложение JBoss не будет перезапущено (или не закроет файл журнала по какой-либо другой причине).
Если вы выполните > server.log
или echo "" > server.log
, это сделает усечение файла до 0 или 1 байта соответственно, так что место на диске будет освобождено. Если приложение JBoss писало в файл, оно будет продолжать писать в той же позиции, на 500+ МБ в файл. Это приводит к разреженному файлу, где файл содержит нулевые байты до позиции, где приложение начало запись в него. Например, если файл был 500 МБ, когда вы его усекли, а приложение продолжало записывать 1 МБ, то размер файла составляет 501 МБ, но дисковое пространство, занимаемое файлом, составляет только 1 МБ, а первые 500 МБ файла - это нулевые байты.
Если вы хотите, чтобы приложение писало в начало файла, вам придется указать ему это сделать. Как правило, вы говорите ему закрыть текущий файл журнала и начать новый. Как grebneke прокомментировал: смотрите Как очистить server.log в JBoss?
Используйте для этого Ansible. ниже представлен модуль ansible для создания разделов.
parted: device: /dev/sdb number: "{{ item.num }}" state: present with_items: - {num : 1, 2, 3, 4, 5.... till 20} - filesystem: fstype: ext2 dev: /dev/sdb"{{item.num}}" with_items: - {num : 1, 2, 3, 4, 5.... till 20}