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)?