lsof:読み書き用に開いたファイルを表示する

lsof:読み書き用に開いたファイルを表示する

パーティションをに再マウントしようとするとread-onlyエラーが発生します/foo is busy。開いているすべての/fooファイルを一覧表示できます。

lsof /foo

read-onlyただし、ファイルが開いているかどうかはわかりませんread-write。開いているファイルだけを一覧表示する方法はありますかread-write

答え1

この質問に具体的に答えるには、次のようにします。

lsof /foo | awk 'NR==1 || $4~/[0-9]+u/'

read-writeこれにより、マウントポイントの下に開いているファイルが表示されますfoo。しかし、実際にやりたいことは、書き込み用に開いているすべてのファイルを一覧表示することです。これには、開いたファイルwrite-onlyだけでなく開いたファイルも含まれますread-write。これを行うには、次の手順を実行します。

lsof /foo | awk 'NR==1 || $4~/[0-9]+[uw]/'

FD出力の4番目のフィールドが空で、他のフィールドが空でない場合、これらのコマンドは機能します。 Debian でコマンドにパスを含めると、このような場合がありますlsof。ただし、パスが含まれていない場合は、空のTID(そして混乱する可能性があるawk)追加のフィールドが印刷されます。マイルは、リリースまたはバージョンによってlsof異なります。

答え2

FD出力で列の値を表示しますlsof。たとえば、

sudo lsof +d /foo

マンページでは解釈について説明します。 「r」は読み取りを意味し、「w」は読み取り/書き込みアクセスを意味します。

これは、興味のあるオブジェクトを一覧表示するのに簡単に使用できます。

sudo lsof +d /foo | awk '/$4~/u/ {print $NF}'   

答え3

ファイルへの読み取りおよび書き込みアクセス権を持つListプロセスを使用することは幸運ではありませんでしたがlsof(ビルドでオプションを無視した可能性がありますlsof)、最終的に見つかりました。デジタル海へのこのガイドこの情報を取得するために使用する方法を示しますfuser

以下はUbuntu 16.04ボックスのいくつかのテスト出力です。

$ sudo fuser -v /etc/os-release

                     ユーザーPIDアクセスコマンド
/usr/lib/os-release: root 827 f.... snapd

$ sudo fuser -v /proc/kmsg

                     ユーザーPIDアクセスコマンド
/proc/kmsg: syslog 989 f....rsyslogd

で述べたようにガイド:

上記の出力は、詳細モードで実行すると、ヒューズユーティリティがUSER、PID、ACCESS、およびCOMMANDに関する情報を提供することを示しています。 e(実行ファイル実行)、r(ルートディレクトリ)、f(ファイルを開く。デフォルト表示モードではFを省略)、F(書き込み用ファイルを開く、デフォルト表示モードではFを省略)など、さまざまな種類のアクセスがあります。 。 )など(mmapされたファイルまたは共有ライブラリ)。

上記の各例では、ファイルは読み取り用に開きます。以下は、書き込み用にファイルを開く例です。

$ sudo fuser -v /run/systemd/journal/syslog

                     ユーザーPIDアクセスコマンド
/run/systemd/log/syslog:
                     ルート 1 F....systemd
                     システムログ 989 F...rsyslogd

systemdここでは、両方とも「ファイル」(この場合はソケット)へのrsyslogd書き込みアクセス権を持っていることがわかります。/run/systemd/journal/syslog

関連情報