lsof:警告:不能stat()fuse.gvfsd-保险丝文件系统


25

这里到底发生了什么?

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.

仅当您发出lsof(不使用|and grep)时,是否收到此警告?
2014年

两种方式都会发生相同的警告,但只会lsof输出一大堆打开的文件。我认为这是一个附带问题。我认为可能是某个进程使文件保持打开状态,这可能是root无法移动文件的原因,但事实并非如此。因此造成混乱。
jmunsch 2014年

1
是的,看起来can't stat...是另一个问题。我认为真正的问题是No such file or directory您遇到的错误。这听起来很愚蠢,但是位置/ home / bob / Desktop是否存在?
2014年

Answers:


30

FUSE及其访问权限

lsof默认情况下,检查所有已安装的文件系统,包括FUSE-在用户空间中实现的文件系统,这些文件系统在Linux中具有特殊的访问权限。

如您在Ask Ubuntu上答案中所看到的,通常只有已安装GVFS文件系统的用户(的所有者gvfsd-fuse)才能访问已安装的GVFS文件系统(FUSE的特殊情况)。甚至root无法访问它。要覆盖此限制,可以使用安装选项allow_rootallow_other。还必须在FUSE守护程序中启用该选项,例如在此答案中对此进行了描述...但是,在您的情况下,您不需要(也不应该)更改访问权限。

从lsof中排除文件系统

就您而言lsof,不需要检查GVFS文件系统,因此您可以stat()使用-e选项排除对它们的调用(或者您可以忽略警告):

lsof -e /run/user/1000/gvfs

通过lsof检查某些文件

您仅lsof用于获取有关系统上正在运行的所有进程的信息,然后才使用过滤完整的输出grep。如果您只想检查某些文件,并且相关进程使用的-f选项没有紧随其后的值,则在“选项结尾”分隔符之后指定文件列表--。这将大大加快。

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

一般解决方案

要排除所有stat()失败的已挂载文件系统,可以运行以下命令(在中bash):

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

或确保使用stat()test -e可以以其他方式实现):

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

11

lsof总是尝试获取有关所有文件系统的一些基本信息,即使这些参数恰好暗示着不会从特定文件系统得到任何结果。如果它无法访问文件系统(具体来说stat,如消息所示,在其安装点调用),则会抱怨。

作为root,您通常具有访问文件系统的权限。但是,由于FUSE的内部工作原理,root用户不会自动拥有FUSE文件系统的所有功能。这不是安全功能(root可以成为拥有文件系统并以这种方式获得访问权限的用户),这是一个技术限制。

GVFS-FUSE是熔丝接口GVFS,这是一种机制,它允许应用程序侏儒通过侏儒插件实现的访问虚拟文件系统:GVFS授予通过常规文件系统接口非侏儒应用程序访问这些虚拟文件系统。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.