O Linux só possui bloqueios cooperativos. Nada impedirá que um processo abra um arquivo que tenha permissão para abrir. Você precisaria chamar um mecanismo de bloqueio em todos os processos usando o arquivo para impedir o acesso simultâneo. No entanto, o que você está tentando fazer não tem nada a ver com acesso simultâneo, até onde eu posso ver.
Se você remover um arquivo que está aberto em um processo, o arquivo não será removido: somente o nome dele será removido. O arquivo em si é realmente removido apenas quando não tem mais nenhum nome (link físico zero) e não está mais aberto. Portanto, se você executar rm server.log
enquanto o aplicativo JBoss ainda estiver aberto, isso não liberará espaço em disco até que o aplicativo JBoss seja reiniciado (ou feche o arquivo de log por algum outro motivo).
Se você executar > server.log
ou echo "" > server.log
, isso faz truncar o arquivo para 0 ou 1 bytes, respectivamente, para que o espaço em disco seja liberado. Se o aplicativo JBoss estiver gravando no arquivo, ele continuará gravando na mesma posição, 500 MB no arquivo. Isso resulta em um arquivo esparso , onde o arquivo contém bytes nulos até a posição em que o aplicativo começou a gravar nele. Por exemplo, se o arquivo tiver 500 MB quando você o truncou e o aplicativo continuar gravando 1 MB, o tamanho do arquivo será de 501 MB, mas o espaço em disco ocupado pelo arquivo é de apenas 1 MB e os primeiros 500 MB do arquivo são bytes nulos.
Se você quiser que o aplicativo escreva no início do arquivo, terá que dizer para fazer isso. Normalmente, você diria para fechar seu arquivo de log atual e iniciar um novo. Como grebneke comentado : veja Como limpar server.log no JBoss?