web-dev-qa-db-ja.com

デバイスのアンマウントを妨げているプロセスを確認するにはどうすればよいですか?

sb deviceumount /run/media/theDriveでアンマウントしたいのですが、drive is busyエラーが発生します。

デバイスにアクセスしているプロセスまたはプログラムを確認するにはどうすればよいですか?

70
Stefan

使用する lsof | grep /media/whateverマウントを使用しているものを見つける。

また、umount -l(レイジーumount)。クリーンアップ中に新しいプロセスがドライブを使用しないようにします。

70

ほとんどの場合、使用するのに最適なコマンドは lsof (“liです。 stopenfイル」)。

lsof +f -- /media/usb0

どこ /media/usb0は、アンマウントするUSB​​ドライブまたはその他のファイルシステムのマウントポイントです。 +f --は、後続の引数をマウントポイントとして扱うようにlsofに指示します。常にではありませんが、通常は独自に管理するため、lsof /media/usb0も機能します。これにより、開いているファイル(リンクされていないファイルも含む)、メモリマップファイル、現在のディレクトリ、およびその他のあいまいな使用法が見つかります。他のユーザーのプロセスに関する情報を取得するには、rootとしてコマンドを実行する必要があります(lsofをrootとして実行する必要があるuniceがあると思います)。

Lsofが見つけられない用途があります。これらはリムーバブルメディアでは一般的ではありません。以下が含まれます:

  • マウントポイント:マウント解除できません/fooの場合/foo/barはマウントポイントです。
  • マウントデバイス:マウント解除できません/fooの場合/foo/barは、マウントされたブロックデバイスまたはループマウントされた通常のファイル、またはLinuxバインドマウントのソースである場合。
  • NFSエクスポート:lsofは、ツリーがカーネルNFSサーバーによってエクスポートされたことを検出しません。

ピンチで機能する別のコマンドは、fuserです。これは、デバイス上でファイルが開いているプロセスのPIDのみを一覧表示します。

fuser -m /media/usb0

ファイルを開く

ファイルが開いているプロセスが通常の原因です。それらを表示します。

_lsof +f -- <mountpoint or device>
_

_/dev/<device>_ではなく_/mountpoint_を使用することには利点があります。マウントポイントは_umount -l_の後に消えるか、オーバーレイマウントによって非表示になる場合があります。

fuserも使用できますが、lsofの方が便利な出力です。ただし、fuserは、ドラマを引き起こしているプロセスを強制終了して、自分の生活を続けることができる場合に役立ちます。

_<mountpoint>_上のファイルを一覧表示します(上記の警告を参照):

_fuser -vmM <mountpoint>
_

ファイルを書き込み用に開いているプロセスのみを対話的に強制終了します。

_fuser -vmMkiw <mountpoint>
_

読み取り専用(_mount -o remount,ro <mountpoint>_)を再マウントした後、残りのすべてのプロセスを強制終了しても安全です(r)。

_fuser -vmMk <mountpoint>
_

マウントポイント

犯人はカーネルそのものかもしれません。 umountを実行しようとしているファイルシステムにマウントされている別のファイルシステムは、問題を引き起こします。確認する:

_mount | grep <mountpoint>/
_

ループバックマウントの場合( thanks Stephen Kitt )、次の出力も確認してください:

_losetup -la
_

匿名のiノード(Linux)

匿名のiノード は次の方法で作成できます。

  • 一時ファイル(open with _O_TMPFILE_)
  • inotify 時計
  • [eventfd]
  • [イベントポール]
  • [timerfd]

これらは最もわかりにくいタイプのポケモンであり、lsofTYPE列に_a_inode_として表示されます(これは lsofに文書化されていません)マンページ )。

これらは_lsof +f -- /dev/<device>_には表示されないため、以下を行う必要があります。

_lsof | grep a_inode
_

匿名のiノードを保持しているプロセスの強制終了については、次を参照してください: 現在のinotify監視(パス名、PID)をリストする

inotifyウォッチ(Linux)

このコメント は、inotifyがアンマウントを妨げるべきではない理由を説明していますが、 このメモ は、それがする状況を説明します

アンマウントはvx_softcnt_flush()呼び出しでハングする可能性があります。ハングが発生するのは、inotifyウォッチが_i_count_変数をインクリメントし、inotifyウォッチャーが保留を解除するまで_v_os_hold value_が上昇したままになるためです。

9
Tom Hale

Peterが言ったようにlsofを使用することができます。あるいは、これらすべてを殺してアンマウントしたいだけの場合は、おそらく次のようにすることができます。

fuser -Mk /mnt/path
umount /mnt/path
8
pioto

GNOMEを使用している場合、Nautilus経由でアンマウントすると、ドライブをまだ使用しているプロセスと、ドライブが使用しているファイルを示すメッセージが表示されます。

alt text

5
tshepang

(少なくとも)OpenBSDの場合:

$ fstat /mnt/mountpoint

例(doasを使用してfstatをrootとして実行すると、自分のプロセスしか表示されないため):

$ doas fstat /usr/ports
USER     CMD          PID   FD MOUNT        INUM MODE         R/W    SZ|DV NAME
_pbuild  make       15172   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/
_pbuild  make       40034   wd /usr/ports  3923598  drwxrwxr-x     r     1536 /usr/ports/

この場合、ユーザー/usr/portsが2つのmakeプロセスの実行を完了するまで、_pbuildをアンマウントできません。

1
Kusalananda