lsof: PERINGATAN: tidak bisa stat () fuse.gvfsd-fuse sistem file

25

Apa sebenarnya yang terjadi di sini?

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.
Jonunsch
sumber
Apakah Anda mendapatkan peringatan ini saat Anda mengeluarkan saja lsof(tanpa |dan grep)?
Sree
Peringatan yang sama juga terjadi, tetapi hanya lsofmenampilkan daftar besar file yang terbuka. Saya pikir ini adalah masalah sampingan. Saya pikir mungkin file itu ditahan terbuka oleh suatu proses dan itu mungkin menjadi alasan mengapa root tidak dapat memindahkan file, tetapi sepertinya bukan itu masalahnya. Karena itu kebingungan.
jmunsch
1
ya, sepertinya can't stat...ini masalah lain. Saya berasumsi masalah sebenarnya adalah No such file or directorykesalahan yang Anda dapatkan. Ini mungkin terdengar konyol, tetapi apakah lokasi / home / bob / Desktop ada?
Sree

Jawaban:

30

FUSE dan hak aksesnya

lsofsecara default memeriksa semua sistem file yang dipasang termasuk FUSE - sistem file yang diterapkan di ruang pengguna yang memiliki hak akses khusus di Linux.

Seperti yang Anda lihat dalam jawaban ini pada Ask Ubuntu, sistem file GVFS yang terpasang (kasus khusus FUSE) biasanya hanya dapat diakses oleh pengguna yang memasangnya (pemilik gvfsd-fuse). Bahkan roottidak dapat mengaksesnya. Untuk mengesampingkan pembatasan ini, dimungkinkan untuk menggunakan opsi mount allow_rootdan allow_other. Opsi ini juga harus diaktifkan di daemon FUSE yang dijelaskan sebagai contoh dalam jawaban ini ... tetapi dalam kasus Anda, Anda tidak perlu (dan tidak boleh) mengubah hak akses.

Tidak termasuk sistem file dari lsof

Dalam kasus Anda, Anda lsoftidak perlu memeriksa sistem file GVFS sehingga Anda dapat mengecualikan stat()panggilan pada mereka menggunakan -eopsi (atau Anda bisa mengabaikan waring):

lsof -e /run/user/1000/gvfs

Memeriksa file tertentu oleh lsof

Anda menggunakan lsofuntuk mendapatkan informasi tentang semua proses yang berjalan pada sistem Anda dan hanya kemudian Anda memfilter output lengkap menggunakan grep. Jika Anda ingin memeriksa hanya file tertentu dan proses terkait menggunakan -fopsi tanpa nilai langsung mengikutinya maka tentukan daftar file setelah pemisah "akhir opsi" --. Ini akan jauh lebih cepat.

lsof -e /run/user/1000/gvfs -f -- /tmp/report.csv

Solusi umum

Untuk mengecualikan semua sistem file yang terpasang yang stat()gagal, Anda dapat menjalankan sesuatu seperti ini bash:

x=(); for a in $(mount | cut -d' ' -f3); do test -e "$a" || x+=("-e$a"); done
lsof "${x[@]}" -f -- /tmp/report.csv

Atau pasti menggunakan stat()( test -ebisa diterapkan dengan cara yang berbeda):

x=(); for a in $(mount | cut -d' ' -f3); do stat --printf= "$a" 2>/dev/null || x+=("-e$a"); done
pabouk
sumber
11

lsofselalu berusaha untuk mendapatkan beberapa informasi dasar tentang semua sistem file, bahkan jika argumennya menyiratkan bahwa tidak ada hasil yang akan datang dari sistem file tertentu. Jika tidak dapat mengakses sistem file (khususnya, untuk memanggil statpada titik mountnya, seperti pesan tersebut katakan), ia mengeluh.

Sebagai root, Anda biasanya memiliki izin untuk mengakses sistem file. Namun, karena inner FUSE , root tidak secara otomatis memiliki semua kekuatan pada sistem file FUSE. Ini bukan fitur keamanan (root dapat menjadi pengguna yang memiliki sistem file dan mendapatkan akses seperti itu), ini adalah batasan teknis.

GVFS-FUSE adalah antarmuka FUSE ke GVFS , yang merupakan mekanisme yang memungkinkan aplikasi Gnome untuk mengakses sistem file virtual yang diterapkan oleh plugin Gnome: GVFS memberikan akses aplikasi non-Gnome ke sistem file virtual ini melalui antarmuka sistem file biasa.

Gilles 'SANGAT berhenti menjadi jahat'
sumber