FUSE та його права доступу
lsof
за замовчуванням перевіряє всі встановлені файлові системи, включаючи файлові системи FUSE, реалізовані в просторі користувача, які мають спеціальні права доступу в Linux.
Як ви бачите в цій відповіді на запитанні 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()
не вдалося, можна запустити щось подібне (in 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
(без|
і греп)?