如何找出哪些进程阻止卸载设备?

如何找出哪些进程阻止卸载设备?

有时,我想卸载一个USB设备umount /run/media/theDrive,但我收到drive is busy错误。

如何找出哪些进程或程序正在访问设备?

答案1

用于lsof | grep /media/whatever找出正在使用安装座的对象。

另外,请考虑umount -l(延迟卸载)以防止在清理时新进程使用该驱动器。

答案2

大多数时候,最好使用的命令是拉索夫(“stF艾尔斯”)。

lsof +f -- /media/usb0

其中/media/usb0是要卸载的 USB 驱动器或其他文件系统的挂载点。+f --告诉 lsof 将后续参数视为挂载点;它通常(但并非总是)自行管理,因此这lsof /media/usb0也是有效的。这会找到打开的文件(甚至是未链接的文件)、内存映射文件、当前目录和一些更模糊的用途。您需要以 root 身份运行该命令来获取有关其他用户进程的信息(我认为有些 unicelsof必须以 root 身份运行)。

有些用途 lsof 找不到;这些在可移动媒体上并不常见。他们包括:

  • /foo挂载点:如果/foo/bar是挂载点,则无法卸载。
  • /foo挂载设备:如果/foo/bar是已挂载的块设备或循环挂载的常规文件,或者是 Linux 绑定挂载的源,则无法卸载。
  • NFS 导出:lsof 不会检测到内核 NFS 服务器导出树。

另一个可以在紧急情况下使用的命令是 fusionr,它只列出设备上打开文件的进程的 PID:

fuser -m /media/usb0

答案3

打开文件

打开文件的进程是常见的罪魁祸首。显示它们:

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>) 后,可以安全地终止所有剩余进程:

fuser -vmMk <mountpoint>

挂载点

罪魁祸首可能是内核本身。在您尝试安装的文件系统上安装另一个文件系统umount会造成麻烦。检查:

mount | grep <mountpoint>/

对于环回安装(谢谢斯蒂芬·基特),还检查以下输出:

losetup -la

匿名索引节点 (Linux)

匿名索引节点可以通过以下方式创建:

  • 临时文件(openO_TMPFILE
  • inotify手表
  • [事件fd]
  • [事件调查]
  • [计时器]

这些是最难以捉摸的口袋妖怪类型,并在lsofTYPE专栏中显示为a_inode(在 lsof手册页)。

它们不会出现在 中lsof +f -- /dev/<device>,因此您需要:

lsof | grep a_inode

要终止持有匿名 inode 的进程,请参阅:列出当前 inotify 监视(路径名,PID)

inotify手表(Linux)

这条评论解释原因inotify 不应该防止卸载,但是这张纸条描述了它所处的情况将要:

卸载可能会挂起在vx_softcnt_flush()调用中。发生挂起是因为 inotify 监视程序增加i_count变量并导致v_os_hold value保持高位,直到 inotify 监视程序释放保持。

答案4

如果您使用 GNOME,通过 Nautilus 卸载将显示一条消息,说明哪个进程仍在使用该驱动器以及它正在使用的文件。

替代文本

相关内容