Linux命令學習(1)-fuser, lsof, pidof(查詢已開啟文件或已運行程序開啟之文件)

摘自《鳥哥的Linux私房菜》第十七章、程序管理與 SELinux 初探


查詢已開啟文件或已運行程序開啟之文件

  • fuser : 藉由文件(或文件系統(tǒng))找出正在使用該文件的程序
[root@www ~]# fuser [-umv] [-k [i] [-signal]] file/dir
選項:
-u :除了程序的 PID 之外,同時列出該程序的擁有者;
-m :后面接的那個檔名會主動的上提到該文件系統(tǒng)的最頂層,對 umount 不成功很有效!
-v :可以列出每個文件與程序還有命令的完整相關性!
-k :找出使用該文件/目錄的 PID ,并試圖以 SIGKILL 這個訊號給予該 PID;
-i :必須與 -k 配合,在刪除 PID 之前會先詢問使用者意愿!
-signal:例如 -1 -15 等等,若不加的話,默認是 SIGKILL (-9) 羅!

范例一:找出目前所在目錄的使用 PID/所屬帳號/權限 為何?
[root@croot t]# fuser -uv .
                     USER        PID ACCESS COMMAND
.:                   scu        9678 ..c.. (scu)bash
                     root       9794 ..c.. (root)su
                     root       9795 ..c.. (root)bash

ACCESS:
c :此程序在當前的目錄下(非次目錄);
e :可被觸發(fā)為運行狀態(tài);
f :是一個被開啟的文件;
r :代表頂層目錄 (root directory);
F :該文件被開啟了,不過在等待回應中;
m :可能為分享的動態(tài)函式庫; 

范例二:找到所有使用到 /etc 這個文件系統(tǒng)的程序吧!
[root@croot /]# fuser -uv /etc 
# 不會顯示任何數(shù)據(jù),因為沒有任何程序會去使用 /proc 這個目錄!
# 會被用到的是 /proc 底下的文件!所以你應該要這樣做:
[root@croot /]# fuser -muv /etc
                     USER        PID ACCESS COMMAND
/etc:                root          1 Frce. (root)init
                     root          2 .rc.. (root)kthreadd/133118
                     root          3 .rc.. (root)khelper/133118
                     root        143 .rce. (root)udevd
                     dbus        552 .rce. (dbus)dbus-daemon
                     root        568 .rce. (root)udevd
                      ...

范例三:找到 /var 底下屬於 Socket 類型的文件,并且找出存取該文件的程序
[root@croot /]# find /var -type s 
/var/run/cups/cups.sock
/var/run/charon.ctl
/var/run/charon.vici
/var/run/dbus/system_bus_socket
[root@croot /]# fuser -uv /var/run/cups/cups.sock 
                     USER        PID ACCESS COMMAND
/var/run/cups/cups.sock:
                     root        592 F.... (root)cupsd

范例四:同范例三,但試圖刪除該 PID?但『不要』刪除喔!
[root@croot /]# fuser -ki /var/run/cups/cups.sock 
/var/run/cups/cups.sock:   592
Kill process 592 ? (y/N) n


[root@www ~]# lsof [-aUu] [+d]
選項與參數(shù):
-a 列出打開文件存在的進程
-c<進程名> 列出指定進程所打開的文件
-g  列出GID號進程詳情
-d<文件號> 列出占用該文件號的進程
+d<目錄>  列出目錄下被打開的文件
+D<目錄>  遞歸列出目錄下被打開的文件
-n<目錄>  列出使用NFS的文件
-i<條件>  列出符合條件的進程。(4、6、協(xié)議、:端口、 @ip )
-p<進程號> 列出指定進程號所打開的文件
-u  列出UID號進程詳情
-h 顯示幫助信息
-v 顯示版本信息

[root@croot /]# lsof -i4:21
COMMAND    PID USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME
pure-ftpd 1087 root    3u  IPv4 491026879      0t0  TCP *:ftp (LISTEN)

COMMAND:進程的名稱
PID:進程標識符
PPID:父進程標識符(需要指定-R參數(shù))
USER:進程所有者
PGID:進程所屬組
FD:文件描述符,應用程序通過文件描述符識別該文件。如cwd、txt等
(1)cwd:表示current work dirctory,即:應用程序的當前工作目錄,這是該應用程序啟動的目錄,除非它本身對這個目錄進行更改
(2)txt :該類型的文件是程序代碼,如應用程序二進制文件本身或共享庫,如上列表中顯示的 /sbin/init 程序
(3)lnn:library references (AIX);
(4)er:FD information error (see NAME column);
(5)jld:jail directory (FreeBSD);
(6)ltx:shared library text (code and data);
(7)mxx :hex memory-mapped type number xx.
(8)m86:DOS Merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (OpenBSD);
(14)v86  VP/ix mapped file;
(15)0:表示標準輸出
(16)1:表示標準輸入
(17)2:表示標準錯誤
一般在標準輸出、標準錯誤、標準輸入后還跟著文件狀態(tài)模式:r、w、u等
(1)u:表示該文件被打開并處于讀取/寫入模式
(2)r:表示該文件被打開并處于只讀模式
(3)w:表示該文件被打開并處于
(4)空格:表示該文件的狀態(tài)模式為unknow,且沒有鎖定
(5)-:表示該文件的狀態(tài)模式為unknow,且被鎖定
同時在文件狀態(tài)模式后面,還跟著相關的鎖
(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分寫鎖)
(5)W:for a write lock on the entire file;(整個文件的寫鎖)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part      of the file;
(9)X:for an SCO OpenServer Xenix lock on the      entire file;
(10)space:if there is no lock.
TYPE:文件類型,如DIR、REG等,常見的文件類型
(1)DIR:表示目錄
(2)CHR:表示字符類型
(3)BLK:塊設備類型
(4)UNIX: UNIX 域套接字
(5)FIFO:先進先出 (FIFO) 隊列
(6)IPv4:網(wǎng)際協(xié)議 (IP) 套接字
DEVICE:指定磁盤的名稱
SIZE:文件的大小
NODE:索引節(jié)點(文件在磁盤上的標識)
NAME:打開文件的確切名稱

  • pidof : 找出某支正在運行的程序的 PID
[root@www ~]# pidof [-sx] program_name
選項與參數(shù):
-s :僅列出一個 PID 而不列出所有的 PID
-x :同時列出該 program name 可能的 PPID 那個程序的 PID

[root@croot /]# pidof init su bash
1 9794 9795
[root@croot /]# 
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

  • linux資料總章2.1 1.0寫的不好抱歉 但是2.0已經(jīng)改了很多 但是錯誤還是無法避免 以后資料會慢慢更新 大...
    數(shù)據(jù)革命閱讀 13,269評論 2 33
  • 一個程序被加載到內(nèi)存當中運行,那么在內(nèi)存內(nèi)的那個數(shù)據(jù)就被稱為進程(process)。進程是操作系統(tǒng)上非常重要的概念...
    Zhang21閱讀 2,110評論 0 12
  • 基礎命令 為了在 sudo 中設置權限提升,您需要編輯 sudoers 文件。 你不應該直接編輯文件,而是使用:s...
    米開朗基樂閱讀 2,090評論 0 5
  • 大家都知道,Linux系統(tǒng)提供了非常多非常多的命令或工具,這些命令都各有所長,都是系統(tǒng)需要的。但我們精力有限,要掌...
    劉振鋒閱讀 11,689評論 10 90
  • 兩天時間把《分身》看完了,說實話故事的情節(jié)并不很吸引我,醫(yī)學界的事總感覺離我遙不可及。雙葉和鞠子是用晶子的卵子...
    皮小懶閱讀 3,897評論 0 2

友情鏈接更多精彩內(nèi)容