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
lsof
(без|
и grep)?