lsof: ПРЕДУПРЕЖДЕНИЕ: не может stat () файловая система fuse.gvfsd-fuse

Что именно происходит здесь?

[email protected]:/# 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.
16 голосов | спросил jmunsch 4 ThuEurope/Moscow2014-12-04T21:53:11+03:00Europe/Moscow12bEurope/MoscowThu, 04 Dec 2014 21:53:11 +0300 2014, 21:53:11

2 ответа


25

FUSE и его права доступа

lsof по умолчанию проверяет все смонтированные файловые системы, включая FUSE - файловые системы, реализованные в пользовательском пространстве, которые имеют особые права доступа в Linux.

Как вы можете видеть в этом ответе на Ask Ubuntu установленный файловая система GVFS (специальный случай 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
ответил pabouk 4 ThuEurope/Moscow2014-12-04T22:45:57+03:00Europe/Moscow12bEurope/MoscowThu, 04 Dec 2014 22:45:57 +0300 2014, 22:45:57
11

lsof всегда пытается получить некоторую базовую информацию обо всех файловых системах, даже если аргументы предполагают, что результат не будет получен из конкретной файловой системы. Если он не может получить доступ к файловой системе (в частности, для вызова stat в точке монтирования, как говорится в сообщении), он жалуется.

Как root, вы обычно имеете разрешение на доступ к файловой системе. Однако из-за внутренней работы FUSE корневой каталог автоматически не имеет всех возможностей файловой системы FUSE. Это не функция безопасности (root может стать пользователем, которому принадлежит файловая система и получить доступ таким образом), это техническое ограничение.

GVFS-FUSE - это интерфейс FUSE для GVFS , который является механизмом, позволяющим приложениям Gnome получать доступ к виртуальным файловым системам плагинами Gnome: GVFS предоставляет приложениям без Gnome доступ к этим виртуальным файловым системам через обычный интерфейс файловой системы.

ответил Gilles 5 FriEurope/Moscow2014-12-05T04:24:43+03:00Europe/Moscow12bEurope/MoscowFri, 05 Dec 2014 04:24:43 +0300 2014, 04:24:43

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132