FUSE e seus direitos de acesso
lsof
por 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 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 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, lsof
não é necessário verificar os sistemas de arquivos GVFS para que você possa excluir as stat()
chamadas usando a -e
opção (ou simplesmente ignorar o aviso):
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 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 -f
opçã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 -e
pode 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
lsof
(sem o|
e grep)?