程式扎記: [Linux 常見問題] umount 時 出現 "Device is busy" 的解法

標籤

2012年8月23日 星期四

[Linux 常見問題] umount 時 出現 "Device is busy" 的解法


來源自 這裡
前言 :
當任何目錄有 mount, 然後有程式 使用/掛 在那個目錄上的話, 就沒有辦法 umount 掉, 於 umount 時會出現 Device is busy 的訊息. 問題是要怎麼找出是哪個程式掛在那個目錄上? 然後去把那個程式砍掉呢? 可以考慮使用命令 fuser.

實際範例 :
那要怎麼找出是哪個程式掛在那個目錄上, 可以使用 "fuser - identify processes using files or sockets". 這邊我們要模擬這樣的狀況, 首先將 /dev/sdf1 mount 到 /johnext 上面 :
$ sudo mount -t ntfs /dev/sdf1 /johnext # 根據自己的實際狀況進行修改 mount 的命令

接著 change directory 到 mount 點, 執行下面 Python 程式碼模擬 "打死不退的" Process :
- hook.py :[b]
  1. #!/usr/bin/python  
  2. import time  
  3.   
  4. print("Hook and don't exit!")  
  5. while True:  
  6.     print("Sleep 1 sec...")  
  7.     time.sleep(1)  
接著如下執行 :
$ nohup ./host.py &
[1] 26674

接著使用另一個 tty 登入該 Host, 並嘗試 umount /johnext :
$ sudo umount /johnext/
umount: /johnext: device is busy.
(In some cases useful info about processes that use
the device is found by lsof(8) or fuser(1))
$ fuser /johnext/ # 檢視在 mount 點有哪些 process 在跑.
/johnext: 26674c
$ ps -aux | grep 26674
nlg 26674 0.0 0.0 10556 3720 pts/1 S 16:35 0:00 /usr/bin/python ./hook.py # 可以知道就是剛剛我們執行的 hook.py

而那個 26674 即是PID, 而 c 的含意可以參考如下 :
c: current directory.
e: executable being run.
f: open file. f is omitted in default display mode.
F: open file for writing. F is omitted in default display mode.
r: root directory.
m: mmap'ed file or shared library.

知道是那些 Processes 造成無法 umount 也確定那些是可以 kill 的 trivial process 後, 可以使用 kill -9 砍到這些 processes :
$ sudo kill -9 26674
$ sudo umount /johnext/ # 此時應該就可以成功 umount
This message was edited 9 times. Last update was at 23/08/2012 16:44:24

沒有留言:

張貼留言

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!