当我lsof
像sudo
这样使用时
sudo lsof ~
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/nes/.gvfs
Output information may be incomplete.
但是,当我不使用时sudo
,不会出现此错误。
这条消息是什么意思?
答案1
有一个 FUSE 虚拟文件系统安装在~/.gvfs
。
对于大多数文件系统访问,root 用户的权限会被忽略。但是,FUSE 虚拟文件系统挂载是少数例外之一。FUSE 虚拟文件系统通常仅限于挂载它们的用户。
在这种情况下,gvfs-fuse-daemon
命令(作为桌面会话的一部分运行)创建了此挂载,属于您,并且没有其他人可以访问它,包括 root。
答案2
也有类似的问题Unix 和 Linux:lsof:警告:无法 stat() fuse.gvfsd-fuse 文件系统它有两个有趣的答案,我在下面引用。
pabouk - 乌克兰保持强势的答案:
FUSE 及其访问权限
lsof
默认情况下检查所有已挂载的文件系统,包括保险丝- 在用户空间实现的文件系统在 Linux 中具有特殊的访问权限。正如你所看到的在 Ask Ubuntu 上回答一辆垂直起降系统文件系统(FUSE 的特殊情况)通常仅供挂载它的用户(的所有者
gvfsd-fuse
)访问。即使root
无法访问它。要覆盖此限制,可以使用挂载选项allow_root
和allow_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
Gilles 的回答是“所以,别再作恶了”:
lsof
总是尝试获取有关所有文件系统的一些基本信息,即使参数恰好暗示某个文件系统不会产生任何结果。如果它无法访问文件系统(具体来说,stat
如消息所述,无法在其挂载点调用),它会发出抱怨。作为 root,您通常有权访问文件系统。但是,由于保险丝,root 不会自动拥有 FUSE 文件系统的所有权限。这不是安全功能(root 可以成为拥有文件系统的用户并以此方式获得访问权限),而是一项技术限制。
GVFS-FUSE 是一个 FUSE 接口垂直起降系统,这是一种允许 Gnome 应用程序访问由 Gnome 插件实现的虚拟文件系统的机制:GVFS 允许非 Gnome 应用程序通过常规文件系统接口访问这些虚拟文件系统。