解決方案二:借助/proc
相關鏈結
有時候你會發現某些檔案在不停的增長嚴重占用了磁碟空間,你想找到罪魁禍首是誰,該怎麼做呢?
涉及到的命令: fuser
本部分以archlinux系統為例
在archlinux上,fuser命令是屬於psmisc
包中的,因此執行下面命令安裝:
sudo pacman -s psmisc --noconfirm
fuser的使用方法非常簡單,只需要直接後接要檢視的檔案路徑就行了。比如:
sleep 10 >/tmp/test &fuser /tmp/test 2>&1
/tmp/test: 2405063
我們可以看到,fuser告訴我們程序2405063
開啟了/tmp/test
這個檔案,我們用ps
來看一下
ps -elf |grep 2405063 |grep -v grep
0 s lujun99+ 2405063 1554 0 80 0 - 2092 - 10:50 ? 00:00:00 sleep 10
若我們只想直接殺掉開啟該檔案的程序,那麼可以直接使用-k
選項(或者--kill
選項):
sleep 10 >/tmp/test &fuser -k /tmp/test 2>&1
ps -elf |grep sleep |grep -v grep
/tmp/test: 2405271[1]+ 已殺死 sleep 10 > /tmp/test
涉及到的命令: bash
本部分以archlinux系統為例
我們知道/proc/$pid/fd/
目錄下儲存著程序號為$pid
的程序所開啟的所有檔案描述符號和對應的檔案路徑:
ls -l /proc/$$/fd/
總用量 0lr-x------ 1 lujun9972 lujun9972 64 3月 30 10:59 0 -> /tmp/ob-input-syotni
l-wx------ 1 lujun9972 lujun9972 64 3月 30 10:59 1 -> pipe:[10559772]
l-wx------ 1 lujun9972 lujun9972 64 3月 30 10:59 2 -> /tmp/emacsqh0w9r
所以我們可以通過遍歷該目錄下的所有檔案描述符所指向的檔案路徑來找出開啟檔案的程序號:
#!/usr/bin/
envbash
function
abs_path
()/$"
}function
is_opened_file
()/fd/*
doif[
["$(
readlink
$f)" == "$"
]];then
return0fi
done
return1}
function
fileuser()"
"$";then
echo $
fidone
}sleep 10 > /tmp/test &
fileuser /tmp/test
2461994
不過相比於第乙個解決方案來說,這個解決方案特別慢,在我電腦上耗費了差不多10秒鐘才出結果。
更多常見選項請執行man fuser
或fuser --help
檢視幫助
linux檢視開啟檔案的命令 lsof
簡介 lsof可以列出某個程序開啟的所有檔案資訊。開啟的檔案可能是普通的檔案,目錄,nfs檔案,塊檔案,字元檔案,共享庫,常規管道,明明管道,符號鏈 接,socket流,網路socket,unix域socket,以及其它更多。因為unix系統中幾乎所有東西都是檔案,你可以想象lsof該有多有用。ls...
如何檢視程序開啟了哪些檔案
有許多情況下,我們需要檢視乙個程序當前開啟了哪些檔案,反過來我們也希望知道某乙個檔案正在被哪些程序所讀寫。在linux下有許多有用的工具可以幫我們完成這兩個工作,下面介紹這兩個工具 lsof與fuser。fuser find files or sockets user 格式 fuser 選項 fna...
如何檢視程序開啟了哪些檔案
有許多情況下,我們需要檢視乙個程序當前開啟了哪些檔案,反過來我們也希望知道某乙個檔案正在被哪些程序所讀寫。在linux下有許多有用的工具可以幫我們完成這兩個工作,下面介紹這兩個工具 lsof與fuser。fuser find files or sockets user 格式 fuser 選項 fna...