Linux運維基礎之lsof命令詳解

Linux運維基礎之lsof命令詳解

lsof 命令是 “List Open Files(列出開啟的檔案)” 的縮寫,它是 Linux 作業系統中的一個強大工具,可提供有關各種程序開啟的檔案的重要資訊。這條多功能命令允許系統管理員監控和管理檔案、套接字和網路連線,提供系統內資源使用情況的全面檢視。

netstatfuser 命令類似,lsof 命令用於識別不同程序正在訪問的檔案,是故障排除和系統維護不可或缺的工具。無論你是尋求解決衝突的網路管理員,還是希望優化資源分配的開發人員,lsof 命令(通常與 grep 等命令一起使用)都是你工具包中的得力助手。

如何安裝 lsof 命令

許多 Linux 發行版都預裝了 lsof 命令。不過,如果你的系統上沒有,也可以使用發行版專用的軟體包管理器輕鬆安裝。

基於 Debian 的系統(如 Ubuntu)

安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt-get update
sudo apt-get install lsof
sudo apt-get update sudo apt-get install lsof
sudo apt-get update
sudo apt-get install lsof

解除安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt-get remove lsof
sudo apt-get remove lsof
sudo apt-get remove lsof

基於紅帽的系統(如 CentOS、RHEL)

使用 Yum 安裝(舊版本):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo yum install lsof
sudo yum install lsof
sudo yum install lsof

使用 DNF 安裝(較新版本):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo dnf install lsof
sudo dnf install lsof
sudo dnf install lsof

使用 Yum 解除安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo yum remove lsof
sudo yum remove lsof
sudo yum remove lsof

使用 DNF 解除安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo dnf remove lsof
sudo dnf remove lsof
sudo dnf remove lsof

Fedora

安裝(舊版本使用 Yum):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo yum install lsof
sudo yum install lsof
sudo yum install lsof

安裝(使用 DNF 的較新版本):

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo dnf install lsof
sudo dnf install lsof
sudo dnf install lsof

使用 Yum 解除安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo yum remove lsof
sudo yum remove lsof
sudo yum remove lsof

使用 DNF 解除安裝:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo dnf remove lsof
sudo dnf remove lsof
sudo dnf remove lsof

如何使用 lsof

1. 列出所有開啟的檔案

語法: lsof

說明:列出系統中所有開啟的檔案。

示例: lsof

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
bash 1234 user txt REG 253,1 111350 123456 /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,1 4096 2 / bash 1234 user txt REG 253,1 111350 123456 /bin/bash
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
systemd    1 root  cwd    DIR  253,1     4096      2 /
bash    1234 user  txt    REG  253,1   111350 123456 /bin/bash

該輸出會顯示所有開啟的檔案,包括命令名稱、程序 ID ( PID )、使用者、檔案描述符 ( FD )、型別、裝置、大小和檔案路徑。

2. 列出特定使用者開啟的檔案

語法: lsof -u <username>

說明:列出特定使用者開啟的所有檔案。

示例: lsof -u john

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 5678 john cwd DIR 253,1 4096 78901 /home/john
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 5678 john cwd DIR 253,1 4096 78901 /home/john
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    5678 john  cwd    DIR  253,1     4096  78901 /home/john

該輸出會列出使用者 john 開啟的所有檔案,包括命令名稱、PID、使用者和其他詳細資訊。

3. 列出特定程序使用的檔案

語法: lsof -p <PID>

說明:列出特定程序 ID 使用的所有檔案。

示例: lsof -p 1234

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1234 user cwd DIR 253,1 4096 78901 /home/user
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1234 user cwd DIR 253,1 4096 78901 /home/user
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1234 user  cwd    DIR  253,1     4096  78901 /home/user

該輸出列出了 PID 為 1234 的程序使用的所有檔案,包括命令名稱、PID、使用者和其他詳細資訊。

4. 列出特定埠上的檔案

語法: lsof -i :<port>

說明:列出與特定網路埠相關聯的所有檔案。

示例: lsof -i :80

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
apache 1234 www-data 4u IPv4 12345 0t0 TCP *:http (LISTEN)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache 1234 www-data 4u IPv4 12345 0t0 TCP *:http (LISTEN)
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
apache  1234 www-data  4u  IPv4  12345      0t0  TCP *:http (LISTEN)

此輸出列出了與 80 埠(通常用於 HTTP)相關的所有檔案。其中包括命令名稱、PID、使用者和其他與網路連線相關的詳細資訊。

5. 列出特定命令開啟的檔案

語法: lsof -c <command_name>

說明:列出特定命令開啟的所有檔案。

示例: lsof -c sshd

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root cwd DIR 253,1 4096 2 /
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1234 root cwd DIR 253,1 4096 2 /
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
sshd    1234 root  cwd    DIR  253,1     4096      2 /

該輸出會列出 sshd 命令開啟的所有檔案,包括命令名稱、PID、使用者和其他詳細資訊。

6. 列出在特定檔案系統上開啟的檔案

語法: lsof +D <directory>

說明:列出在特定目錄或檔案系統中開啟的所有檔案。

示例: lsof +D /var

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
syslog 567 root 5w REG 253,2 4096 12345 /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME syslog 567 root 5w REG 253,2 4096 12345 /var/log/syslog
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
syslog  567 root    5w   REG  253,2     4096  12345 /var/log/syslog

該輸出會列出在 /var 目錄中開啟的所有檔案,包括命令名稱、PID、使用者和其他詳細資訊。

7. 列出特定協議的網路檔案

語法: lsof -i <protocol>

說明:列出使用特定協議(如 TCP 或 UDP)的所有網路檔案。

示例: lsof -i TCP

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1234 root 3u IPv4 56789 0t0 TCP *:ssh (LISTEN)
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 1234 root 3u IPv4 56789 0t0 TCP *:ssh (LISTEN)
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1234 root    3u  IPv4  56789      0t0  TCP *:ssh (LISTEN)

此輸出會列出所有 TCP 網路連線,包括命令名稱、PID、使用者和其他與網路連線相關的詳細資訊。

8. 列出不包括特定使用者開啟的檔案

語法: lsof -u ^<username>

說明:列出所有檔案,但不包括特定使用者開啟的檔案。

示例: lsof -u ^john

輸出:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,1 4096 2 /
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd DIR 253,1 4096 2 /
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
systemd    1 root  cwd    DIR  253,1     4096      2 /

該輸出列出了除使用者 john 開啟的檔案外的所有檔案,包括命令名稱、PID、使用者和其他詳細資訊。

更多 Linux 命令

目錄操作 rmdir · cd · pwd · exa · ls
檔案操作 cat · cp · dd · less · touch · ln · rename · more · head
檔案系統操作 chown · mkfs · locate
網路 ping · curl · wget · iptables · mtr
搜尋和文字處理 find · grep · sed · whatis · ripgrep · fd · tldr
系統資訊和管理 env · history · top · who · htop · glances · lsof
使用者和會話管理 screen · su · sudo · open

評論留言