web-dev-qa-db-ja.com

Linuxで「umount-l」の後にファイルを使用してプロセスを確実に決定する方法

質問

マウントされたファイルシステムでumount -lが実行された後、このファイルシステム上のいくつかのファイルへの(少なくとも)1つの開いているファイルハンドルを維持するプロセスのために、このファイルシステムはマウントされたままです(非表示ですが)。そのようなプロセスのリスト?

テストセットアップ

私は次の手順を実行して、このような状況を作成し、システムを調べて、さまざまなコマンドを試しました(Linux3.16カーネルでdebianjessieのbachを使用)。

Sudo -i
cd $(mktemp -d) # get empty directory to play around with
# create empty file system with one file
dd if=/dev/zero of=disk bs=1M count=4
mkfs.ext4 disk
# mount the filesytem and create a file
mkdir mounted
mount disk mounted # uses /dev/loop0 in my case, actual device my vary
touch mounted/file
# fork of a process with an open file handle to file
bash -c 'cd mounted; exec 3<>file; while true; do sleep inf; done' &
# verify that the file is open in the background
lsof mounted/file
# lazy unmount
umount -l mounted
# even remove the mountpoint 
rmdir mounted

では、隠しマウントされた/ dev/loop0内のいくつかのファイルを開いているすべてのプロセスを表示するコマンドは何でしょうか?

失敗した試行

lsof

lsof -p <thepid>

まず、これにはプロセスID(ここで検索される情報)の事前知識が必要です。次に、開いているファイルは/fileとして表示され、通常のルートファイルシステムではなく非表示のマウントされたファイルシステムにあることを示しません。 。

フューザー

フューザーから有用な出力を得ることができませんでした。マンページの何かが私を逃していると思います。

/ sys/fs /の検査

この特定のテストセットアップでは、ファイルシステム(ext4)とデバイス(loop0)が既知です。そこで、ファイルシステムがすでに非マウント状態から非マウント状態に変更されているかどうかを確認できます。

if [ -e /sys/fs/ext4/loop0/ ]; then
    echo "still not unmounted";
else
    echo "finally unmounted";
fi

ただし、これは開いているファイルハンドルを持つプロセスのリストを提供しません。

/ procを手動で検査する

Procでいくつかの情報が見つかりました:

mnt_idがシステム全体で一意であると仮定すると(その仮定が正しいかどうかはわかりません!)すべてのリストを作成できますnon -すべてのプロセスで非表示のmnt_ids

find /proc/ -maxdepth 1 -type d -regex '/proc/[0-9]+' -exec "cat" "{}/mountinfo" ";" | cut -d " " -f 1 | sort -gu

次に、実際にすべてのリストを作成します開いているfdでmnt_idsを使用

find /proc/ -regex '/proc/[0-9]+/fdinfo/[0-9]+' -exec cat "{}" ";" | grep mnt_id | cut -f 2 | sort -gu
# maybe gives some errors like 'Operation not permitted' or 'No such file or directory' because of inspecting it's own process and sub-process and possibly parallel things happening. probably this is an unreliable way of inspecting /proc.

洗練されたアプローチを使用して、これら2つのリストを比較する場合、非表示のmnt_idを、それらを使用するfdおよびこれらのfdのプロセスIDとともに判別できます。 。しかし、その結果があっても、これらの非表示のmnt_idのどれが対象の非表示にマウントされたファイルシステムに対応するかを知る最後のステップはまだ欠落しています。

5

マウントポイントがumount -lで非表示になる方法のため、影響を受けるファイルをまだ使用しているプロセスを見つける方法はありません。

リストを取得する唯一の方法は、umount -lの前にlsofを使用して、関連するパスをgrepすることです。例:lsof | grep "/mountPoint/"

必要に応じて、その出力を取得してPIDを抽出し、監視を続けることができます。

2
Julie Pelletier