web-dev-qa-db-fra.com

lsof: AVERTISSEMENT: ne peut pas stat () Fuse.gvfsd-Fuse système de fichiers

Que se passe-t-il exactement ici?

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.
27
jmunsch

Fusible et ses droits d'accès

lsof par défaut vérifie tous les systèmes de fichiers montés, y compris Fuse - les systèmes de fichiers implémentés dans l'espace utilisateur qui ont des droits d'accès spéciaux sous Linux.

Comme vous pouvez le voir dans ce réponse sur Ask Ubunt un système de fichiers monté GVFS (cas spécial de Fuse) est normalement accessible uniquement aux l'utilisateur qui l'a monté (le propriétaire de gvfsd-Fuse). Même root ne peut pas y accéder. Pour contourner cette restriction, il est possible d'utiliser les options de montage allow_root Et allow_other. L'option doit également être activée dans le démon Fuse qui est décrit par exemple dans ce answer ... mais dans votre cas, vous n'avez pas besoin (et ne devez pas) changer les droits d'accès.

Exclusion de systèmes de fichiers de lsof

Dans votre cas, lsof n'a pas besoin de vérifier les systèmes de fichiers GVFS, vous pouvez donc exclure les appels de stat() à l'aide de l'option -e (Ou vous pouvez simplement ignorer le waring ):

lsof -e /run/user/1000/gvfs

Vérification de certains fichiers par lsof

Vous utilisez lsof pour obtenir des informations sur tous les processus en cours d'exécution sur votre système et vous filtrez ensuite la sortie complète à l'aide de grep. Si vous souhaitez vérifier uniquement certains fichiers et que les processus associés utilisent l'option -f Sans qu'une valeur la suive directement, spécifiez une liste de fichiers après le séparateur "fin des options" --. Ce sera considérablement plus rapide.

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

Solution générale

Pour exclure tous les systèmes de fichiers montés sur lesquels stat() échoue, vous pouvez exécuter quelque chose comme ceci (dans bash):

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

Ou pour être sûr d'utiliser stat() (test -e Pourrait être implémenté d'une manière différente):

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

lsof essaie toujours d'obtenir des informations de base sur tous les systèmes de fichiers, même si les arguments impliquent qu'aucun résultat ne proviendra d'un système de fichiers particulier. S'il est incapable d'accéder à un système de fichiers (en particulier, pour appeler stat à son point de montage, comme le dit le message), il se plaint.

En tant que root, vous auriez normalement la permission d'accéder aux systèmes de fichiers. Cependant, en raison du fonctionnement interne de Fuse , root n'a pas automatiquement tous les pouvoirs sur un système de fichiers Fuse. Ce n'est pas une fonction de sécurité (root peut devenir l'utilisateur qui possède le système de fichiers et y accéder de cette façon), c'est une limitation technique.

GVFS-Fuse est une interface Fuse pour GVFS , qui est un mécanisme qui permet aux applications Gnome d'accéder aux systèmes de fichiers virtuels implémentés par les plugins Gnome: GVFS accorde des applications non-Gnome l'accès à ces systèmes de fichiers virtuels via l'interface du système de fichiers standard.