lsof: AVISO: não pode stat () fuse.gvfsd-fuse file system

17

O que exatamente está acontecendo aqui?

root@bob-p7-1298c:/# ls -l /tmp/report.csv && lsof | grep "report.csv"
-rw-r--r-- 1 mysql mysql 1430 Dec  4 12:34 /tmp/report.csv
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
    
por jmunsch 04.12.2014 / 19:53

2 respostas

26

FUSE e seus direitos de acesso

lsof por padrão verifica todos os sistemas de arquivos montados, incluindo FUSE - sistemas de arquivos implementados no espaço do usuário que têm acesso especial direitos no Linux.

Como você pode ver nesta resposta no Ask Ubuntu , um GVFS (caso especial do FUSE) é normalmente acessível apenas ao usuário que o montou (o proprietário de gvfsd-fuse ). Mesmo root não pode acessá-lo. Para substituir essa restrição, é possível usar as opções de montagem allow_root e allow_other . A opção também deve estar ativada no daemon do FUSE, que é descrito, por exemplo, nesta resposta ... mas no seu caso você não precisa (e não deve) alterar os direitos de acesso.

Excluindo sistemas de arquivos de lsof

No seu caso lsof não precisa verificar os sistemas de arquivos GVFS para que você possa excluir as chamadas stat() sobre eles usando a opção -e (ou você pode simplesmente ignorar a advertência):

lsof -e /run/user/1000/gvfs

Verificando certos arquivos por lsof

Você está usando lsof para obter informações sobre todos os processos em execução em seu sistema e somente depois filtra a saída completa usando grep . Se você quiser verificar apenas determinados arquivos e os processos relacionados, use a opção -f sem um valor diretamente seguindo-o, em seguida, especifique uma lista de arquivos após o separador "fim de opções" -- . Isso será consideravelmente mais rápido.

lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv

Solução geral

Para excluir todos os sistemas de arquivos montados nos quais stat() falha, é possível executar algo assim (em bash ):

x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv

Ou para ter certeza de usar stat() ( test -e poderia ser implementado de uma maneira diferente):

x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done
    
por 04.12.2014 / 20:45
11

lsof sempre tenta obter algumas informações básicas sobre todos os sistemas de arquivos, mesmo que os argumentos impliquem que nenhum resultado virá de um determinado sistema de arquivos. Se não for possível acessar um sistema de arquivos (especificamente, chamar stat em seu ponto de montagem, como a mensagem diz), ele reclama.

Como root, você normalmente teria permissão para acessar sistemas de arquivos. No entanto, devido ao funcionamento interno do FUSE , o root não tem todos os poderes automaticamente em um sistema de arquivos FUSE. Este não é um recurso de segurança (o root pode se tornar o usuário que possui o sistema de arquivos e obter acesso dessa maneira), é uma limitação técnica.

O GVFS-FUSE é uma interface do FUSE para o GVFS , que é um mecanismo que permite que os aplicativos do Gnome acessem sistemas de arquivos virtuais implementados por plug-ins do Gnome: o GVFS concede aos aplicativos não-Gnome acesso a esses sistemas de arquivos virtuais por meio da interface de sistema de arquivos normal.

    
por 05.12.2014 / 02:24