パーティションをに再マウントしようとすると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