lsof: AVISO: não é possível o sistema de arquivos stat () fuse.gvfsd-fuse

25

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.
jmunsch
fonte
Você está recebendo este aviso quando emite apenas lsof(sem o |e grep)?
Sree 4/04
O mesmo aviso ocorre de qualquer maneira, mas apenas lsofgera uma grande lista dos arquivos abertos. Eu acho que é uma questão paralela. Eu pensei que talvez o arquivo tenha sido mantido aberto por um processo e talvez esse tenha sido o motivo pelo qual o root não conseguiu mover o arquivo, mas esse não parece ser o caso. Daí a confusão.
jmunsch
11
Sim, parece que o can't stat...é outro problema. Presumo que o verdadeiro problema é o No such file or directoryerro que você está recebendo. Isso pode parecer idiota, mas a localização / home / bob / Desktop existe?
S4 de

Respostas:

30

FUSE e seus direitos de acesso

lsofpor padrão, verifica todos os sistemas de arquivos montados, incluindo sistemas de arquivos FUSE implementados no espaço do usuário que possuem direitos de acesso especiais no Linux.

Como você pode ver nesta resposta em Pergunte ao Ubuntu, um sistema de arquivos GVFS montado (caso especial do FUSE) normalmente é acessível apenas ao usuário que o montou (o proprietário gvfsd-fuse). Mesmo rootnão pode acessá-lo. Para substituir essa restrição, é possível usar as opções de montagem allow_roote allow_other. A opção também deve ser ativada no daemon do FUSE, 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, lsofnão é necessário verificar os sistemas de arquivos GVFS para que você possa excluir as stat()chamadas usando a -eopção (ou simplesmente ignorar o aviso):

lsof -e /run/user/1000/gvfs

Verificando certos arquivos por lsof

Você está usando lsofpara obter informações sobre todos os processos em execução no sistema e só então filtrar a saída completa usando grep. Se você deseja verificar apenas certos arquivos e os processos relacionados, use a -fopção sem um valor diretamente a seguir, especifique uma lista de arquivos após o separador "fim das 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, você pode executar algo como isto (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, certifique-se de usar stat()( test -epode 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
pabouk
fonte
11

lsofsempre tenta obter algumas informações básicas sobre todos os sistemas de arquivos, mesmo se os argumentos implicarem que nenhum resultado virá de um sistema de arquivos específico. Se não conseguir acessar um sistema de arquivos (especificamente, para chamar statno seu ponto de montagem, como diz a mensagem), 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 possui automaticamente todos os poderes em um sistema de arquivos do FUSE. Este não é um recurso de segurança (o root pode se tornar o usuário proprietário do 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 aos aplicativos Gnome acessar sistemas de arquivos virtuais implementados pelos plug-ins do Gnome: O GVFS concede aos aplicativos não-Gnome acesso a esses sistemas de arquivos virtuais por meio da interface regular do sistema de arquivos.

Gilles 'SO- parar de ser mau'
fonte