FUSE y sus derechos de acceso
lsof
de forma predeterminada, verifica todos los sistemas de archivos montados, incluido FUSE , sistemas de archivos implementados en el espacio del usuario que tienen derechos de acceso especiales en Linux.
Como puede ver en esta respuesta en Preguntar a Ubuntu, un sistema de archivos GVFS montado (caso especial de FUSE) normalmente es accesible solo para el usuario que lo montó (el propietario de gvfsd-fuse
). Incluso root
no puedo acceder a él. Para anular esta restricción, es posible utilizar las opciones de montaje allow_root
y allow_other
. La opción también debe estar habilitada en el demonio FUSE que se describe, por ejemplo, en esta respuesta ... pero en su caso no necesita (y no debe) cambiar los derechos de acceso.
Excluyendo sistemas de archivos de lsof
En su caso lsof
, no necesita verificar los sistemas de archivos GVFS para que pueda excluir las stat()
llamadas en ellos utilizando la -e
opción (o simplemente puede ignorar la advertencia):
lsof -e /run/user/1000/gvfs
Comprobación de ciertos archivos por lsof
Está utilizando lsof
para obtener información sobre todos los procesos que se ejecutan en su sistema y solo entonces filtra el resultado completo utilizando grep
. Si desea verificar solo ciertos archivos y los procesos relacionados, use la -f
opción sin un valor que lo siga directamente y luego especifique una lista de archivos después del separador "fin de opciones" --
. Esto será considerablemente más rápido.
lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv
Solución general
Para excluir todos los sistemas de archivos montados en los que stat()
falla, puede ejecutar algo como esto (en bash
):
x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv
O para estar seguro de usar stat()
( test -e
podría implementarse de una manera diferente):
x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done
lsof
(sin el|
y grep)?