ここで何が起こっているのですか?
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.
lsof
は、デフォルトで、マウントされたすべてのファイルシステムをチェックします Fuse -Linuxで特別なアクセス権を持つユーザースペースに実装されたファイルシステム。
これからわかるように、 Ask Ubuntuでの回答 マウントされた [〜#〜] gvfs [〜#〜] ファイルシステム(Fuseの特殊なケース)は通常、マウントしたユーザー(_gvfsd-Fuse
_の所有者)。 root
でもアクセスできません。この制限を無効にするには、マウントオプション_allow_root
_および_allow_other
_を使用できます。このオプションは、たとえば answer ...で説明されているFuseデーモンでも有効にする必要がありますが、この場合、アクセス権を変更する必要はありません(変更する必要もありません)。
あなたの場合、lsof
はGVFSファイルシステムをチェックする必要がないため、_-e
_オプションを使用してstat()
呼び出しを除外できます(または、警告を無視できます)。 :
_lsof -e /run/user/1000/gvfs
_
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
_
lsof
は、特定のファイルシステムからの結果がないことを引数が示唆している場合でも、常にすべてのファイルシステムに関するいくつかの基本情報を取得しようとします。ファイルシステムにアクセスできない場合(具体的には、メッセージが示すように、マウントポイントでstat
を呼び出す場合)、メッセージが表示されます。
Rootとして、通常はファイルシステムにアクセスする権限を持っています。ただし、 Fuse の内部動作により、rootは自動的にFuseファイルシステムのすべての機能を備えているわけではありません。これはセキュリティ機能ではありません(rootはファイルシステムを所有するユーザーになり、その方法でアクセスできるようになります)。これは技術的な制限です。
GVFS-Fuseは [〜#〜] gvfs [〜#〜] へのFuseインターフェースであり、GnomeアプリケーションがGnomeプラグインによって実装された仮想ファイルシステムにアクセスできるようにするメカニズムです:GVFSは非Gnomeアプリケーションを許可します通常のファイルシステムインターフェイスを介してこれらの仮想ファイルシステムにアクセスします。