Answers:
使用lsof | grep /media/whatever
找出正在使用的坐骑。
另外,请考虑umount -l
(延迟卸载)以防止新进程在清理时使用驱动器。
fuser -mv /path/to/mountpoint
可能更容易使用替代点找到流程。
lsof | grep
对我来说更好。fuser -mv
似乎只丢弃了80多个不相关的进程。我正在使用安装绑定目录。
大多数时候,要使用的最佳命令是lsof的(“ 升我小号吨ö笔˚F尔斯”)。
lsof +f -- /media/usb0
/media/usb0
USB驱动器或其他文件系统的挂载点在哪里。+f --
告诉lsof将后续参数视为安装点;它通常(但不总是)自行管理,因此lsof /media/usb0
也可以工作。这会找到打开的文件(甚至是未链接的文件),内存映射的文件,当前目录以及一些晦涩的用法。您需要以root用户身份运行命令以获取有关其他用户进程的信息(我认为有些地方lsof
必须以root用户身份运行)。
lsof无法找到某些用途;这些在可移动媒体上并不常见。他们包括:
/foo
,如果/foo/bar
是安装点。/foo
如果/foo/bar
是已挂载的块设备或循环挂载的常规文件,或者是Linux绑定挂载的源文件,则无法卸载。紧急情况下可以使用的另一个命令是fuser,它仅列出设备上带有打开文件的进程的PID:
fuser -m /media/usb0
您可以lsof
像Peter所说的那样使用,或者如果您确定只想杀死所有这些东西并卸下它,则可以执行以下操作:
fuser -Mk /mnt/path
umount /mnt/path
-M
以确保安全。
-M
应该应用哪个命令。
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.
带有打开文件的进程是常见的罪魁祸首。显示它们:
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
可以通过以下方式创建匿名索引节点:
open
带有O_TMPFILE
)这些是最难以捉摸的神奇宝贝类型,在lsof
的TYPE
列中显示为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
部分。
对于(至少)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
进程的运行。
这是一个常见的陷阱:您向另一个用户(root用户或任何其他用户)求助,切换到已安装设备的目录,然后以该用户身份注销。当您忘记自己留在该目录中时,可以尝试查找直到您失明为止。lsof
确实会向外壳程序显示哪个当前目录正在使用该设备。您可能希望再次以该用户的身份更改目录。