功能說明
lsof 全名為list open files,也就是列舉系統中已經被打開的文件,通過lsof命令,就可以根據文件找到對應的進程信息,也可以根據進程信息找到進程打開的文件。
【語法格式】
lsof [option]
lsof [選項]
參數選項 解釋說明
-c<進程名> 顯示指定的進程名所打開的文件
-p<進程號> 顯示指定的進程號所打開的文件
-i 通過監聽指定的協議、端-和主機等信息,顯示符合條件的進程信息
-u 顯示指定用戶使用的文件
-U 顯示所有socket文件
范例11-1:顯示使用文件的進程。
[root@lewen ~]# lsof /var/log/messages COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME abrt-watc 8718 root 4r REG 253,0 404668 522404 /var/log/messages rsyslogd 10046 root 6w REG 253,0 404668 522404 /var/log/messages 如果想知道某個特定的文件是由哪個進程在使用,就可以通過“lsof文件名”的方式 來得到。從上面的輸出可以得知,/var/log/messages文件是由rsyslogd進程在使用。 輸出中每列的含義具體如下。 -COMMAND:命令,進程的名稱。 -PID:進程號。 -USER:進程的所有者。 -FD:文件描述符,它又包含如下內容。 0:表示標准輸出。 1:表示標准輸入。 2:表示標准錯誤。 u:表示該文件被打開並處於讀取/寫人模式。 r:表示該文件被打開並處於只讀模式。 w:表示該文件被打開並處於寫人模式。 -TYPE:文件類型,REG(regular)為普通文件。 -DEVICE:指定磁盤的名稱。 -SIZE/OFF:文件的大小。 -NODE:索引節點。 -NAME:文件名稱。
范例11-2:顯示指定進程所打開的文件。
[root@lewen ~]# lsof -c rsyslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 10046 root cwd DIR 253,0 224 64 / rsyslogd 10046 root rtd DIR 253,0 224 64 / rsyslogd 10046 root txt REG 253,0 664080 522402 /usr/sbin/rsyslogd ...
范例11-3:顯示指定進程號所打開的文件。
[root@lewen ~]# lsof -p 10046 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 10046 root cwd DIR 253,0 224 64 / rsyslogd 10046 root rtd DIR 253,0 224 64 / rsyslogd 10046 root txt REG 253,0 664080 522402 /usr/sbin/rsyslogd ...
范例11-4:監聽指定的協議、端口和主機等信息,顯示符合條件的進程信息。
在講解范例之前,我們先來看看相應的語法格式:
lsof -i [46] [protocol][@8hostname][:service|port]
其中各項的含義如下。
- 46:4代表IPv4,6代表IPv6。
- protocol:傳輸協議,可以是TCP或UDP。
- hostname:主機名稱或者IP地址。
- service:進程的服務名,例如NFS、SSH和FTP等。
- port:系統中與服務對應的端口號。例如HTTP服務默認對應的端口號為80,SS日服務默認對應的端口號為22。了解了語法格式之后,再來看看范例的解答。
[root@lewen ~]# lsof -i #<=查看所有進程。 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 10044 root 3u IPv4 49337 0t0 TCP *:ssh (LISTEN) sshd 10044 root 4u IPv6 49346 0t0 TCP *:ssh (LISTEN) master 10215 root 13u IPv4 50008 0t0 TCP localhost:smtp (LISTEN) master 10215 root 14u IPv6 50009 0t0 TCP localhost:smtp (LISTEN) sshd 10805 root 3u IPv4 52326 0t0 TCP k8s-node1:ssh->10.0.0.1:10662 (ESTABLISHED) [root@lewen ~]# lsof -i tcp # <=顯示所有tcp網培連接的進程信息 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 10044 root 3u IPv4 49337 0t0 TCP *:ssh (LISTEN) sshd 10044 root 4u IPv6 49346 0t0 TCP *:ssh (LISTEN) master 10215 root 13u IPv4 50008 0t0 TCP localhost:smtp (LISTEN) master 10215 root 14u IPv6 50009 0t0 TCP localhost:smtp (LISTEN) sshd 10805 root 3u IPv4 52326 0t0 TCP k8s-node1:ssh->10.0.0.1:10662 (ESTABLISHED) [root@lewen ~]# lsof -i :22 #<=顯示端口為22的進程,這條命今很常用 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 10044 root 3u IPv4 49337 0t0 TCP *:ssh (LISTEN) sshd 10044 root 4u IPv6 49346 0t0 TCP *:ssh (LISTEN) sshd 10805 root 3u IPv4 52326 0t0 TCP k8s-node1:ssh->10.0.0.1:10662 (ESTABLISHED) [root@lewen ~]# lsof -i tcp:22 #<==星示同時滿足TCP和端口為22的進程。 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 10044 root 3u IPv4 49337 0t0 TCP *:ssh (LISTEN) sshd 10044 root 4u IPv6 49346 0t0 TCP *:ssh (LISTEN) sshd 10805 root 3u IPv4 52326 0t0 TCP k8s-node1:ssh->10.0.0.1:10662 (ESTABLISHED)
范例11-5:顯示指定用戶使用的文件。
[lewen@k8s-node1 ~]$ lsof -u lewen COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 11081 lewen cwd DIR 253,0 62 33997200 /home/lewen bash 11081 lewen rtd DIR 253,0 224 64 / bash 11081 lewen txt REG 253,0 964608 50333656 /usr/bin/bash bash 11081 lewen mem REG 253,0 61624 34664 /usr/lib64/libnss_files-2.17.so bash 11081 lewen mem REG 253,0 106075056 50334298 /usr/lib/locale/locale-archive bash 11081 lewen mem REG 253,0 2151672 34646 /usr/lib64/libc-2.17.so bash 11081 lewen mem REG 253,0 19288 34652 /usr/lib64/libdl-2.17.so
范例11-6:顯示所有socket文件。
[root@k8s-node1 ~]# lsof -U COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root 12u unix 0xffff964f7656e800 0t0 25117 /run/systemd/private systemd 1 root 22u unix 0xffff964f7656fc00 0t0 25169 /run/lvm/lvmpolld.socket systemd 1 root 23u unix 0xffff9650714f8400 0t0 8992 /run/systemd/notify systemd 1 root 24u unix 0xffff9650714f8000 0t0 8994 /run/systemd/cgroups-agent