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


Answers:


57

使用lsof | grep /media/whatever找出正在使用的坐骑。

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


24
fuser -mv /path/to/mountpoint可能更容易使用替代点找到流程。
Riccardo Murri 2010年

@RiccardoMurri lsof | grep对我来说更好。fuser -mv似乎只丢弃了80多个不相关的进程。我正在使用安装绑定目录。
Ricky Boyce

1
umount -l是危险的。而是mount -o bind 将模式000空目录放在顶部,然后通过进行清理lsof +f -- /dev/device
汤姆·黑尔

35

大多数时候,要使用的最佳命令是lsof的(“ 小号ö˚F尔斯”)。

lsof +f -- /media/usb0

/media/usb0USB驱动器或其他文件系统的挂载点在哪里。+f --告诉lsof将后续参数视为安装点;它通常(但不总是)自行管理,因此lsof /media/usb0也可以工作。这会找到打开的文件(甚至是未链接的文件),内存映射的文件,当前目录以及一些晦涩的用法。您需要以root用户身份运行命令以获取有关其他用户进程的信息(我认为有些地方lsof必须以root用户身份运行)。

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

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

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

fuser -m /media/usb0

8

您可以lsof像Peter所说的那样使用,或者如果您确定只想杀死所有这些东西并卸下它,则可以执行以下操作:

fuser -Mk /mnt/path
umount /mnt/path

1
如果要这样做,请考虑使用,-M以确保安全。
汤姆·黑尔

@TomHale您可能想弄清楚-M应该应用哪个命令。
HSchmale,

1
fuser-M, --ismountpoint Request will be fulfilled only if NAME specifies a mountpoint. This is an invaluable seatbelt which prevents you from killing the machine if NAME happens to not be a filesystem.
汤姆·黑尔

6

打开文件

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

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>/

对于环回安装(感谢Stephen Kitt),还请检查以下内容的输出:

losetup -la

匿名索引节点(Linux)

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

  • 临时文件(open带有O_TMPFILE
  • 使手表变声
  • [eventfd]
  • [事件投票]
  • [timerfd]

这些是最难以捉摸的神奇宝贝类型,在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监视程序释放保留为止。


还有另一种方法:回送安装:如果您安装文件系统,然后使用回送安装将文件安装在该文件系统上,则将无法卸载第一个文件系统,但是不会显示任何内容lsof
史蒂芬·基特

干杯。添加到此Mountpoints部分。
汤姆·黑尔

5

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

替代文字


1

对于(至少)OpenBSD:

$ fstat /mnt/mountpoint

例如(使用root身份doas执行fstat,否则将只能看到我们自己的进程):

$ 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直到用户_pbuild完成了这两个make进程的运行。


-2

这是一个常见的陷阱:您向另一个用户(root用户或任何其他用户)求助,切换到已安装设备的目录,然后以该用户身份注销。当您忘记自己留在该目录中时,可以尝试查找直到您失明为止。lsof确实会向外壳程序显示哪个当前目录正在使用该设备。您可能希望再次以该用户的身份更改目录。


2
该答案不完整或不正确。我不确定是哪个,因为还不清楚。
hildred '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.