Montagem NFS: Dispositivo ou recurso ocupado

3

Eu indiquei o seguinte link, a solução funciona.

Como superar "dispositivo ou recurso ocupado"?

A solução acima funciona quando você está excluindo o arquivo manualmente. Mas eu tenho um script python que exclui os arquivos (processo automatizado). Às vezes, recebo "Erro de dispositivo ou de recursos ocupados" quando o script tenta excluir os arquivos. Consequentemente, meu script falha. Não sei como resolver esse problema usando meu script python.

EDITAR: O script faz o download dos arquivos de logs de um servidor de log. Esses arquivos são então processados pelo meu script. Após o processamento, o script exclui esses arquivos de log. Eu não acho que há algo errado com o design.

Erro exato:

OSError: [Errno 16] Device or resource busy: '/home/johndoe/qwerty/.nfs000000000471494300000944'
    
por Touchstone 01.03.2017 / 06:10

1 resposta

6

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.)

    
por 02.03.2017 / 15:21