如何檢視開啟指定檔案的程序

2021-10-04 13:52:44 字數 2011 閱讀 6866

解決方案二:借助/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/

總用量 0

lr-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 fuserfuser --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...