如何找出阻止卸载的进程?

Gui*_*oté 31 umount

当我做

sudo umount /media/KINGSTON
Run Code Online (Sandbox Code Playgroud)

我有

umount: /media/KINGSTON: device is busy.
Run Code Online (Sandbox Code Playgroud)

我关闭所有窗口并确保所有 shell 都指向其他目录。如何找到阻止卸载的进程?

ane*_*hep 33

打开终端:

fuser -c /media/KINGSTON
Run Code Online (Sandbox Code Playgroud)

它将输出如下内容:

/media/KINGSTON/: 3106c 11086
Run Code Online (Sandbox Code Playgroud)

这将为您提供使用此卷的进程的 pid。pid 末尾的额外字符将提供一些额外信息。(c 在 3106c)

c - 进程使用文件作为其当前工作目录
m - 文件使用 mmap 映射
o - 进程将其用作打开文件
r - 该文件是进程的根目录
t - 进程正在访问文件作为文本文件
y - 该文件是进程的控制终端

因此,要卸载只需杀死该 pid 并重新尝试卸载

sudo kill -9 3106 11086
sudo umount /media/KINGSTON
Run Code Online (Sandbox Code Playgroud)

注意:要查找这些 pid 的确切应用程序名称,您可以使用此命令

cat /proc/<pid>/cmdline
Run Code Online (Sandbox Code Playgroud)

例如 : cat /proc/11086/cmdline

这将输出如下内容。

    evince^@/media/KINGSTON/Ubuntu-guide.pdf^@
Run Code Online (Sandbox Code Playgroud)

希望这会有所帮助

  • 我建议先在没有 -9 选项的情况下杀死它们,让这些应用程序有机会彻底关闭。我建议使用 `ps &lt;pid&gt;` 而不是编辑 /proc 中的文件来查看命令名称和参数。 (3认同)
  • fuser -ck 也会杀死它。 (2认同)

Gil*_*il' 8

最有用的工具是lsof 安装lsof. 它显示了哪些进程正在使用哪些文件。如果/media/KINGSTON是挂载点(设备名称也适用),以下命令将显示此挂载点上正在使用的所有文件:

lsof /media/KINGSTON
Run Code Online (Sandbox Code Playgroud)

如果您以普通用户身份运行此命令,它只会显示您自己的进程¹。运行sudo lsof /media/KINGSTON以查看所有用户的进程。

的输出lsof如下所示:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
zsh4    31421 gilles  cwd    DIR    8,1     4096 130498 /var/tmp
zsh4    31421 gilles  txt    REG    8,1   550804 821292 /bin/zsh4
zsh4    31421 gilles  mem    REG    8,1    55176 821326 /usr/lib/zsh/4.3.10/zsh/complist.so
zsh4    31421 gilles   12r   REG    8,1   175224 822276 /usr/share/zsh/functions/Completion.zwc
Run Code Online (Sandbox Code Playgroud)

COMMAND列显示可执行程序的名称,该PID列显示进程 ID。该NAME列显示文件名;您可能会看到(deleted)文件在打开时是否被删除(当文件被删除时,它不再具有名称,但它仍然存在,直到使用它的最后一个进程关闭该文件)。USER应该是不言自明的。其他列在这里无关紧要,除了可能FD,它显示了进程如何使用文件:

  • cwd: 当前工作目录
  • txt: 程序可执行²
  • mem: 一个内存映射文件(这里,把它想象成一个打开的文件)
  • 一个数字:一个实际打开的文件;后面的字母表示打开模式,例如r阅读和w写作

没有机械方法来定位打开文件的窗口(这实际上在技术上没有意义:如果一个进程有多个窗口,则文件与一个或另一个窗口没有特别关联),甚至没有任何简单的方法来识别一个进程的窗口(当然一个进程不必有任何窗口)。但通常命令名和文件名足以定位罪犯并正确关闭文件。

如果您无法关闭文件而只想结束它,您可以使用kill 3142131421进程 ID在哪里)或kill -HUP 31421(“挂断”)来终止进程。如果简单的杀戮不能解决问题,请以极端的偏见杀戮:kill -KILL 31421.

lsof 和glsof有一个 GUI ,但它还没有为黄金时间做好准备,并且到目前为止还没有为 Ubuntu 打包。

¹ Lsof 可以列出有关其他用户进程的一些信息,但它不会检测挂载点,因此如果您指定了挂载点,则不会列出它们。
² 在讨论可执行格式时,可执行代码通常称为文本。


pro*_*eos 6

与此同时,fuser 命令也有了很大的改进。您可以使用单个命令完成完整的工作:

$ sudo fuser -ickv /"mountpoint"
Run Code Online (Sandbox Code Playgroud)

在哪里:

  • 参数k杀死有问题的进程,
  • whilev提前显示进程及其用户
  • i要求您确认。

fuser -ickv -9如果某些进程遇到阻力,则使用(或更一般地使用)重试-SIGNAL,以杀死最顽固的进程。
但你总会发现一些“不朽”的过程……!

在这种情况下,我最近学会了使用

$ sudo umount --lazy --force <mountpoint>
Run Code Online (Sandbox Code Playgroud)

作为最后的资源,到目前为止,它每次都对我有用。