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

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.
jmunsch
источник
Вы получаете это предупреждение только тогда, когда выпускаете lsof(без |и grep)?
Шри
То же самое предупреждение происходит в любом случае, но просто lsofвыводит большой список открытых файлов. Я думаю, что это побочный вопрос. Я подумал, что, возможно, файл был открыт процессом, и это могло быть причиной того, что root не смог переместить файл, но это не так. Отсюда и путаница.
Jmunsch
1
да, похоже, can't stat...это другая проблема. Я предполагаю, что настоящая проблема - No such file or directoryошибка, которую вы получаете. Это может показаться идиотским, но существует ли местоположение / home / bob / Desktop?
Шри

Ответы:

30

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параметр без значения, непосредственно следующего за ним, укажите список файлов после разделителя «end of options» --. Это будет значительно быстрее.

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
источник
11

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

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

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

Жиль "ТАК - перестань быть злым"
источник