Что означает это сообщение об ошибке: lsof: ПРЕДУПРЕЖДЕНИЕ: невозможно stat() файловая система fuse.gvfs-fuse-daemon /home/nes/.gvfs
Когда я использую lsof с sudo, как это
sudo lsof ~
lsof: WARNING: can't stat() fuse.gvfs-fuse-daemon file system /home/nes/.gvfs
Output information may be incomplete.
Однако, когда я использую его без sudo, я не получаю эту ошибку.
Что означает это сообщение?
2 ответа
Виртуальная файловая система FUSE смонтирована на ~/.gvfs
,
Для большинства обращений к файловой системе разрешения игнорируются для пользователя root. Однако монтирование виртуальной файловой системы FUSE является одним из редких исключений. Виртуальные файловые системы FUSE обычно ограничены пользователем, который их смонтировал.
В этом случае gvfs-fuse-daemon
Команда (запускаемая как часть сеанса рабочего стола) создала это монтирование, принадлежащее вам, и никто другой не сможет получить к нему доступ, включая root.
В Unix и Linux есть аналогичный вопрос : lsof: ПРЕДУПРЕЖДЕНИЕ: невозможно использовать файловую систему stat() Fuse.gvfsd-fuse. У него есть два интересных ответа, которые я цитирую ниже.
пабук - Украина оставайся сильной ответ :
FUSE и его права доступа
по умолчанию проверяет все смонтированные файловые системы, включая — файловые системы, реализованные в пространстве пользователя, которые имеют специальные права доступа в Linux.
Как вы можете видеть в этом ответе на Ask Ubuntu, смонтированная файловая система (частный случай FUSE) обычно доступна только пользователю, который ее смонтировал (владельцу
gvfsd-fuse
). Дажеroot
не может получить к нему доступ. Чтобы обойти это ограничение, можно использовать параметры монтирования.allow_root
иallow_other
. Опцию также необходимо включить в демоне FUSE, который описан, например, в этом ответе ... но в вашем случае вам не нужно (и не следует) менять права доступа.Исключение файловых систем из lsof
В вашем случае не нужно проверять файловые системы GVFS, поэтому вы можете исключить обращения к ним с помощью команды
-e
вариант (или вы можете просто игнорировать предупреждение):lsof -e /run/user/1000/gvfs
Проверка определенных файлов с помощью lsof
Вы используете для получения информации обо всех процессах, запущенных в вашей системе, и только затем фильтруете полный вывод, используя
grep
. Если вы хотите проверить только определенные файлы и связанные с ними процессы, используйте команду-f
параметр без значения, следующего за ним, затем укажите список файлов после разделителя «конец параметров».--
. Это будет значительно быстрее.lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv
Общее решение
Чтобы исключить все смонтированные файловые системы, в которых произошел сбой, вы можете запустить что-то вроде этого (в
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
Ответ Жиля «ТАК- перестань быть злым» :
lsof
всегда пытается получить некоторую базовую информацию обо всех файловых системах, даже если аргументы подразумевают, что от конкретной файловой системы не будет получено никакого результата. Если он не может получить доступ к файловой системе (в частности, для вызоваstat
в точке монтирования, как говорится в сообщении), он жалуется.Как root, вы обычно имеете разрешение на доступ к файловым системам. Однако из-за внутренней работы FUSEFUSE root не имеет автоматически всех полномочий в файловой системе FUSE. Это не функция безопасности (пользователь root может стать пользователем, владеющим файловой системой, и таким образом получить доступ), это техническое ограничение.
GVFS-FUSE — это интерфейс FUSE для GVFSGVFS , который представляет собой механизм, который позволяет приложениям Gnome получать доступ к виртуальным файловым системам, реализованным плагинами Gnome: GVFS предоставляет приложениям, не принадлежащим Gnome, доступ к этим виртуальным файловым системам через обычный интерфейс файловой системы.