當前位置: 首頁>>技術教程>>正文


如何找出阻止卸載的進程?

問題描述

當我做

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/zh-tw/article/12999.html,未經允許,請勿轉載。