Esses arquivos são marcadores de posição do NFS:
/home/johndoe/qwerty/.nfs000000000471494300000944
Algumas informações
Em um típico sistema de arquivos UNIX, um arquivo que está atualmente em uso e aberto pode ser deletado, mas seu conteúdo não irá realmente desaparecer até que o último manipulador de arquivo seja fechado. Você pode ver isso em ação com código como este:
$ ps -ef >/tmp/temporaryfile
$ ls -l /tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6758 Mar 2 14:02 /tmp/temporaryfile
$ ( sleep 60 ; cat ) </tmp/temporaryfile &
[1] 4864
$ rm /tmp/temporaryfile
$ ls -l /tmp/temporaryfile
ls: cannot access /tmp/temporaryfile: No such file or directory
$ fg # Wait for the rest of the minute
( sleep 60; cat ) < /tmp/temporaryfile
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:44 ? 00:00:02 init [2]
root 2 0 0 09:44 ? 00:00:00 [kthreadd]
root 3 2 0 09:44 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 09:44 ? 00:00:00 [kworker/0:0H]
...
roaima 4857 4786 0 14:02 pts/1 00:00:00 -bash
roaima 4858 4857 0 14:02 pts/1 00:00:00 ps -ef
(Observe que isso é oposto ao Microsoft Windows, onde os arquivos não podem ser excluídos enquanto ainda estão abertos.)
Explicação
Um arquivo em um servidor NFS pode ter um ou mais clientes acessando-o. O próprio NFS é (principalmente) sem estado e, portanto, precisa emular a funcionalidade que permite que um arquivo aberto seja acessado mesmo depois de ser excluído.
A emulação é tratada removendo-se o arquivo do seu lugar no sistema de arquivos, mas deixando-o no lugar como um arquivo cujo nome começa com .nfs
. Quando o último leitor / escritor fechar o seu filehandle para este arquivo, ele será removido do sistema de arquivos.
Veja um exemplo disso em ação:
$ ps -ef > /var/autofs/net/nfsserver/tmp/temporaryfile
$ ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
-rw-r--r-- 1 roaima roaima 6766 Mar 2 14:14 /var/autofs/net/nfsserver/tmp/temporaryfile
$ ( sleep 60 ; cat ) </var/autofs/net/nfsserver/tmp/temporaryfile &
[1] 4987
$ rm /var/autofs/net/nfsserver/tmp/temporaryfile
$ ls -l /var/autofs/net/nfsserver/tmp/temporaryfile
ls: cannot access /var/autofs/net/nfsserver/tmp/temporaryfile: No such file or directory
$ ls -lA /var/autofs/net/nfsserver/tmp/
total 8
-rw-r--r-- 1 roaima roaima 6766 Mar 2 14:14 .nfs000000000100000300000001
$ rm /var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001
rm: cannot remove ‘/var/autofs/net/nfsserver/tmp/.nfs000000000100000300000001’: Device or resource busy
$ fg # Wait for the rest of the minute
( sleep 60; cat ) < /var/autofs/net/nfsserver/tmp/temporaryfile
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 09:44 ? 00:00:02 init [2]
root 2 0 0 09:44 ? 00:00:00 [kthreadd]
root 3 2 0 09:44 ? 00:00:01 [ksoftirqd/0]
...
roaima 4983 4712 0 14:14 pts/0 00:00:00 ps -ef
Corolário
Você deve ignorar arquivos em uma montagem NFS cujos nomes começam com .nfs
. Além disso, seu código precisa lidar com a possibilidade de que um diretório remoto não possa ser excluído até que todos esses arquivos tenham realmente desaparecido.
O NFS não é tão transparente para aplicativos quanto se espera.
Comentários
Pode ser que a razão pela qual os arquivos de log ainda estejam abertos é que eles ainda estão sendo usados pelo processo do registrador em seu sistema remoto. Geralmente, a abordagem para isso seria alternar os arquivos de log e fazer o download e excluir apenas os arquivos de log anteriores, deixando os atuais no sistema de arquivos para uso pelo processo do registrador.
Utilitários como logrotate
lidam com isso com elementos de configuração específicos, como delaycompress
, que tentam garantir que um arquivo de log não seja compactado enquanto ainda estiver em uso. (Veja /etc/logrotate.d/apache2
em pelo menos sistemas Debian para um exemplo.)