当前位置: 首页>>技术教程>>正文


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

问题描述

当我做

sudo umount /media/KINGSTON

我有

umount: /media/KINGSTON: device is busy.

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

最佳方案

打开终端:

fuser -c /media/KINGSTON

它将输出如下内容:

/media/KINGSTON/: 3106c 11086

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

c – 进程将文件用作其当前工作目录 \nm – 文件使用 mmap 映射 \no – 进程将其用作打开文件 \nr – 文件是进程的根目录 \nt -进程正在以文本文件的形式访问文件 \ny – 此文件是进程的控制终端

所以卸载只是杀死那个pids和re-try卸载

sudo kill -9 3106 11086
sudo umount /media/KINGSTON

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

cat /proc/<pid>/cmdline

例如:cat /proc/11086/cmdline

这将输出如下所示的内容。

    evince^@/media/KINGSTON/Ubuntu-guide.pdf^@

希望这会有所帮助

次佳方案

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

lsof /media/KINGSTON

如果您以普通用户身份运行此命令,它只会显示您自己的进程\xb9。运行 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

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

  • cwd : 当前工作目录

  • txt : 程序可执行文件\xb2

  • mem : 一个 memory-mapped 文件(这里,认为它是一个打开的文件)

  • a number:实际打开的文件;后面的一个字母表示打开方式,如r为读,w为写

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

如果您无法关闭文件而只想结束它,您可以使用 kill 31421(其中 31421 是进程 ID)或 kill -HUP 31421(\u201chang up\u201d)来终止进程。如果简单的杀戮没有成功,那就带着极端的偏见杀戮: kill -KILL 31421

lsof 有一个 GUI,glsof,但它还没有完全准备好迎接黄金时段,而且到目前为止还没有为 Ubuntu 打包。

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

第三种方案

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

$ sudo fuser -ickv /"mountpoint"

在哪里:

  • 参数 k 杀死有问题的进程,

  • v 则预先显示进程及其用户

  • i 要求您确认。

如果某些进程抵抗,则使用 fuser -ickv -9 (或更一般地使用 -SIGNAL )再试一次,这会杀死最顽固的进程。\n但你总能找到一些 “immortal” 进程……!

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

$ sudo umount --lazy --force <mountpoint>

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/12999.html,未经允许,请勿转载。