12

When I use lsof with sudo like this

sudo lsof ~


lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/nes/.gvfs
      Output information may be incomplete.

However, when I use it without sudo, I don't get this error.

What does this message mean?

2

2 Answers 2

14

There is a FUSE virtual filesystem mounted at ~/.gvfs.

For the majority of filesystem accesses, permissions are ignored for the root user. However, FUSE virtual filesystem mounts are one of the rare exceptions. FUSE virtual filesystems are normally restricted to the user who mounted them.

In this case, the gvfs-fuse-daemon command (run as part of your desktop session) created this mount, belonging to you, and no-one else can access it, including root.

1
  • 1
    Then how to address it? In case I want to "sudo lso | grep ...".
    – user276851
    Sep 24, 2015 at 18:36
1

There is a similar question in Unix & Linux: lsof: WARNING: can't stat() fuse.gvfsd-fuse file system It has two interesting answers, which I'm quoting below.

pabouk - Ukraine stay strong's answer:

FUSE and its access rights

lsof by default checks all mounted file systems including FUSE - file systems implemented in user space which have special access rights in Linux.

As you can see in this answer on Ask Ubuntu a mounted GVFS file system (special case of FUSE) is normally accessible only to the user which mounted it (the owner of gvfsd-fuse). Even root cannot access it. To override this restriction it is possible to use mount options allow_root and allow_other. The option must be also enabled in the FUSE daemon which is described for example in this answer ...but in your case you do not need to (and should not) change the access rights.

Excluding file systems from lsof

In your case lsof does not need to check the GVFS file systems so you can exclude the stat() calls on them using the -e option (or you can just ignore the waring):

lsof -e /run/user/1000/gvfs

Checking certain files by lsof

You are using lsof to get information about all processes running on your system and only then you filter the complete output using grep. If you want to check just certain files and the related processes use the -f option without a value directly following it then specify a list of files after the "end of options" separator --. This will be considerably faster.

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

General solution

To exclude all mounted file systems on which stat() fails you can run something like this (in bash):

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

Or to be sure to use stat() (test -e could be implemented a different way):

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

Gilles 'SO- stop being evil''s answer:

lsof always tries to obtain some basic information about all filesystems, even if the arguments happen to imply that no result will come from a particular filesystem. If it's unable to access a filesystem (specifically, to call stat at its mount point, as the message says), it complains.

As root, you would normally have permission to access filesystems. However, due to the inner workings of FUSE, root does not automatically have all powers on a FUSE filesystem. This isn't a security feature (root can become the user who owns the filesystem and get access that way), it's a technical limitation.

GVFS-FUSE is a FUSE interface to GVFS, which is a mechanism that allows Gnome applications to access virtual filesystems implemented by Gnome plugins: GVFS grants non-Gnome applications access to these virtual filesystems via the regular filesystem interface.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .