Guillaume Coté Asked: 2010-11-06 23:25:13 +0800 CST2010-11-06 23:25:13 +0800 CST 2010-11-06 23:25:13 +0800 CST 如何找出阻止卸载的进程? 772 当我做 sudo umount /media/KINGSTON 我有 umount: /media/KINGSTON: device is busy. 我关闭所有窗口并确保所有 shell 都指向其他目录。如何找到阻止卸载的进程? umount 4 个回答 Voted Best Answer aneeshep 2010-11-07T00:01:08+08:002010-11-07T00:01:08+08:00 打开终端: fuser -c /media/KINGSTON 它将输出如下内容: /media/KINGSTON/: 3106c 11086 这将为您提供使用此卷的进程的 pid。pid 末尾的额外字符将提供一些额外信息。( 3106c 中的 c) c - 进程将文件用作其当前工作目录 m - 文件使用 mmap 映射 o - 进程将其用作打开文件 r - 文件是进程的根目录 t - 进程正在访问文件作为文本文件 y - 此文件是进程的控制终端 因此,要卸载,只需杀死该 pid 并重新尝试卸载 sudo kill -9 3106 11086 sudo umount /media/KINGSTON 注意:要找到这些 pid 的确切应用程序名称,您可以使用此命令 cat /proc/<pid>/cmdline 例如 : cat /proc/11086/cmdline 这将输出如下所示的内容。 evince^@/media/KINGSTON/Ubuntu-guide.pdf^@ 希望这会有所帮助 Gilles 'SO- stop being evil' 2010-11-07T04:59:23+08:002010-11-07T04:59:23+08:00 最有用的工具是lsof 。它显示了哪些进程正在使用哪些文件。如果/media/KINGSTON是一个挂载点(设备名称也可以),以下命令会显示该挂载点上正在使用的所有文件: lsof /media/KINGSTON 如果您以普通用户身份运行此命令,它只会显示您自己的进程¹。运行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: 可执行程序² mem:一个内存映射文件(在这里,将其视为一个打开的文件) a number:实际打开的文件;后面的字母表示打开模式,例如r用于阅读和w用于书写 没有机械的方法来定位打开文件的窗口(这实际上在技术上没有意义:如果一个进程有多个窗口,则一个文件与一个或另一个窗口没有特别的关联),甚至没有任何简单的识别方法进程的窗口(当然,进程不必有任何窗口)。但通常命令名和文件名就足以找到罪犯并正确关闭文件。 如果您无法关闭文件而只想结束它,您可以使用kill 31421(进程 ID 在哪里31421)或kill -HUP 31421(“挂断”)终止进程。如果简单的杀戮不起作用,那么就带着极端的偏见去杀戮吧:kill -KILL 31421。 lsof, glsof有一个 GUI ,但它还没有为黄金时段做好准备,而且到目前为止还没有为 Ubuntu 打包。 ¹ Lsof 可以列出有关其他用户进程的一些信息,但它不会检测到挂载点,因此如果您指定了挂载点,则不会列出它们。 ² 可执行代码在讨论可执行格式时通常被称为文本。 prometheos 2016-01-14T16:56:17+08:002016-01-14T16:56:17+08:00 同时 fuser 命令也有了很大的改进。您可以使用单个命令完成全部工作: $ sudo fuser -ickv /"mountpoint" 在哪里: 参数k杀死有问题的进程, whilev提前显示过程及其用户 并i要求您确认。 如果某些进程抵抗,然后再试一次fuser -ickv -9(或更一般地用-SIGNAL)杀死最顽固的进程。 但你总会找到一些“不朽”的过程……! 在这种情况下,我最近学会了使用 $ sudo umount --lazy --force <mountpoint> 作为最后的资源,到目前为止,它每次都对我有用。 Hashem Masoud 2010-11-07T00:02:49+08:002010-11-07T00:02:49+08:00 这也可以帮助: lsof | grep \/media\/KINGSTON
打开终端:
它将输出如下内容:
这将为您提供使用此卷的进程的 pid。pid 末尾的额外字符将提供一些额外信息。( 3106c 中的 c)
c - 进程将文件用作其当前工作目录
m - 文件使用 mmap 映射
o - 进程将其用作打开文件
r - 文件是进程的根目录
t - 进程正在访问文件作为文本文件
y - 此文件是进程的控制终端
因此,要卸载,只需杀死该 pid 并重新尝试卸载
注意:要找到这些 pid 的确切应用程序名称,您可以使用此命令
例如 :
cat /proc/11086/cmdline
这将输出如下所示的内容。
希望这会有所帮助
最有用的工具是lsof 。它显示了哪些进程正在使用哪些文件。如果
/media/KINGSTON
是一个挂载点(设备名称也可以),以下命令会显示该挂载点上正在使用的所有文件:如果您以普通用户身份运行此命令,它只会显示您自己的进程¹。运行
sudo lsof /media/KINGSTON
以查看所有用户的进程。的输出
lsof
如下所示:该
COMMAND
列显示程序可执行文件的名称,该PID
列显示进程 ID。该NAME
列显示文件名;您可能会看到(deleted)
文件是否在打开时被删除(当文件被删除时,它不再有名称,但它仍然存在,直到最后一个使用它的进程关闭文件)。USER
应该是不言自明的。其他列在这里无关紧要,除了也许FD
,它显示了进程如何使用文件:cwd
: 当前工作目录txt
: 可执行程序²mem
:一个内存映射文件(在这里,将其视为一个打开的文件)r
用于阅读和w
用于书写没有机械的方法来定位打开文件的窗口(这实际上在技术上没有意义:如果一个进程有多个窗口,则一个文件与一个或另一个窗口没有特别的关联),甚至没有任何简单的识别方法进程的窗口(当然,进程不必有任何窗口)。但通常命令名和文件名就足以找到罪犯并正确关闭文件。
如果您无法关闭文件而只想结束它,您可以使用
kill 31421
(进程 ID 在哪里31421
)或kill -HUP 31421
(“挂断”)终止进程。如果简单的杀戮不起作用,那么就带着极端的偏见去杀戮吧:kill -KILL 31421
。lsof, glsof有一个 GUI ,但它还没有为黄金时段做好准备,而且到目前为止还没有为 Ubuntu 打包。
¹ Lsof 可以列出有关其他用户进程的一些信息,但它不会检测到挂载点,因此如果您指定了挂载点,则不会列出它们。
² 可执行代码在讨论可执行格式时通常被称为文本。
同时 fuser 命令也有了很大的改进。您可以使用单个命令完成全部工作:
在哪里:
k
杀死有问题的进程,v
提前显示过程及其用户i
要求您确认。如果某些进程抵抗,然后再试一次
fuser -ickv -9
(或更一般地用-SIGNAL
)杀死最顽固的进程。但你总会找到一些“不朽”的过程……!
在这种情况下,我最近学会了使用
作为最后的资源,到目前为止,它每次都对我有用。
这也可以帮助: