web-dev-qa-db-ja.com

lsof:警告:Fuse.gvfsd-Fuseファイルシステムをstat()できません

ここで何が起こっているのですか?

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.
27
jmunsch

ヒューズとそのアクセス権

lsofは、デフォルトで、マウントされたすべてのファイルシステムをチェックします Fuse -Linuxで特別なアクセス権を持つユーザースペースに実装されたファイルシステム。

これからわか​​るように、 Ask Ubuntuでの回答 マウントされた [〜#〜] gvfs [〜#〜] ファイルシステム(Fuseの特殊なケース)は通常、マウントしたユーザー(_gvfsd-Fuse_の所有者)。 rootでもアクセスできません。この制限を無効にするには、マウントオプション_allow_root_および_allow_other_を使用できます。このオプションは、たとえば answer ...で説明されているFuseデーモンでも有効にする必要がありますが、この場合、アクセス権を変更する必要はありません(変更する必要もありません)。

Lsofからファイルシステムを除外する

あなたの場合、lsofはGVFSファイルシステムをチェックする必要がないため、_-e_オプションを使用してstat()呼び出しを除外できます(または、警告を無視できます)。 :

_lsof -e /run/user/1000/gvfs
_

Lsofによる特定のファイルの確認

lsofを使用してシステムで実行されているすべてのプロセスに関する情報を取得し、grepを使用して完全な出力をフィルタリングします。特定のファイルのみをチェックし、関連するプロセスが_-f_オプションの直後に値なしで使用する場合は、「オプションの終わり」の区切り記号_--_の後にファイルのリストを指定します。これはかなり速くなります。

_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
_
30
pabouk

lsofは、特定のファイルシステムからの結果がないことを引数が示唆している場合でも、常にすべてのファイルシステムに関するいくつかの基本情報を取得しようとします。ファイルシステムにアクセスできない場合(具体的には、メッセージが示すように、マウントポイントでstatを呼び出す場合)、メッセージが表示されます。

Rootとして、通常はファイルシステムにアクセスする権限を持っています。ただし、 Fuse の内部動作により、rootは自動的にFuseファイルシステムのすべての機能を備えているわけではありません。これはセキュリティ機能ではありません(rootはファイルシステムを所有するユーザーになり、その方法でアクセスできるようになります)。これは技術的な制限です。

GVFS-Fuseは [〜#〜] gvfs [〜#〜] へのFuseインターフェースであり、GnomeアプリケーションがGnomeプラグインによって実装された仮想ファイルシステムにアクセスできるようにするメカニズムです:GVFSは非Gnomeアプリケーションを許可します通常のファイルシステムインターフェイスを介してこれらの仮想ファイルシステムにアクセスします。