【系統】lsof命令簡介

北在南方發表於2016-04-13
losf 命令可以列出某個程式開啟的所有檔案資訊。開啟的檔案可能是普通的檔案,目錄,NFS檔案,塊檔案,字元檔案,共享庫,常規管道,明明管道,符號連結,Socket流,網路Socket,UNIX域Socket,以及其它更多。
1 列出系統上所有開啟的檔案:
[root@rac1 mysql]# lsof | more
COMMAND     PID      USER   FD      TYPE             DEVICE       SIZE       NODE NAME
init          1      root  cwd       DIR                8,3       4096          2 /
init          1      root  rtd       DIR                8,3       4096          2 /
init          1      root  txt       REG                8,3      43496   17727785 /sbin/init

2 檢視誰在使用指定的檔案
[root@rac1 ~]# lsof /tmp/mysql.sock                            
COMMAND   PID  USER   FD   TYPE             DEVICE SIZE     NODE NAME
mysqld  24319 mysql   16u  unix 0xffff8100918a8c00      44743909 /tmp/mysql.sock

3 遞迴檢視指定目錄下所有開啟的檔案
[root@rac1 ~]#  lsof +D /opt/mysql/  
COMMAND   PID  USER   FD   TYPE DEVICE       SIZE     NODE NAME
mysqld  24319 mysql  cwd    DIR    8,3       4096 19824642 /opt/mysql/data
mysqld  24319 mysql    3u   REG    8,3        152 19824646 /opt/mysql/data/mysql-log-bin.index
mysqld  24319 mysql    4uW  REG    8,3 4875878400 20283611 /opt/mysql/data/ibdata1
mysqld  24319 mysql    9uW  REG    8,3    5242880 20283612 /opt/mysql/data/ib_logfile0
mysqld  24319 mysql   10uW  REG    8,3    5242880 20283613 /opt/mysql/data/ib_logfile1
mysqld  24319 mysql   12w   REG    8,3      12957 19824652 /opt/mysql/data/slow_query.log

4 檢視指定使用者開啟的所有檔案
[root@rac1 ~]# lsof -u oracle
COMMAND    PID   USER   FD   TYPE             DEVICE     SIZE     NODE NAME
nmz       3211 oracle  cwd    DIR                8,3     4096 10813466 /home/oracle
nmz       3211 oracle  rtd    DIR                8,3     4096        2 /
nmz       3211 oracle  txt    REG                8,3   673908 19398913 /opt/rac/oracle/11.2.0/rac/ccr/bin/nmz
nmz       3211 oracle  mem    REG                8,3   125736  2820762 /lib/ld-2.5.so
nmz       3211 oracle  mem    REG                8,3  1606808  2818065 /lib/libc-2.5.so
nmz       3211 oracle    3uW  REG                8,3        0 19398727 /opt/rac/oracle/11.2.0/rac/ccr/hosts/rac1/log/sched.lock
nmz       3211 oracle    4w   REG                8,3      853 19398726 /opt/rac/oracle/11.2.0/rac/ccr/hosts/rac1/log/sched.log
nmz       3211 oracle    5r   REG                8,3    16896 20906832 /opt/rac/oracle/11.2.0/rac/ccr/mesg/nmzus.msb
注意:^符號,它執行取反操作 lsof -u ^oracle 表示除oracle 之外的使用者開啟的檔案
5 檢視某個程式開啟的所有檔案
-c選項限定只列出以apache開頭的程式開啟的檔案:
root@rac1 shell]# lsof -c mysql
COMMAND   PID  USER   FD   TYPE             DEVICE       SIZE     NODE NAME
mysqld  24319 mysql  cwd    DIR                8,3       4096 19824642 /opt/mysql/data
mysqld  24319 mysql  rtd    DIR                8,3       4096        2 /
mysqld  24319 mysql  txt    REG                8,3   45648978 23429121 /usr/sbin/mysqld
mysqld  24319 mysql  mem    REG                8,3     139416 21201203 /lib64/ld-2.5.so
mysqld  24319 mysql  mem    REG                8,3    1713160 21201204 /lib64/libc-2.5.so
mysqld  24319 mysql  mem    REG                8,3      23360 21201206 /lib64/libdl-2.5.so
6 檢視某個使用者與某個程式開啟的檔案
lsof -u username -c 程式名    是或的關係,表示所有由某個使用者或某個程式開啟的檔案
lsof -a -u username -c 程式名 是與的關係 
7 檢視所有由某個PID對應的程式開啟的檔案
  使用 -p 引數來過濾輸出
[root@rac1 ~]# lsof  -p 1
COMMAND PID USER   FD   TYPE DEVICE    SIZE     NODE NAME
init      1 root  cwd    DIR    8,3    4096        2 /
init      1 root  rtd    DIR    8,3    4096        2 /
init      1 root  txt    REG    8,3   43496 17727785 /sbin/init
init      1 root  mem    REG    8,3  139416 21201203 /lib64/ld-2.5.so
init      1 root  mem    REG    8,3 1713160 21201204 /lib64/libc-2.5.so
init      1 root  mem    REG    8,3   23360 21201206 /lib64/libdl-2.5.so
init      1 root  mem    REG    8,3   95464 21201216 /lib64/libselinux.so.1
init      1 root  mem    REG    8,3  247528 21201215 /lib64/libsepol.so.1
init      1 root   10u  FIFO   0,17             1477 /dev/initctl
8 檢視網路連線
-i 引數列出所有開啟了網路套接字(TCP和UDP)的程式
 a 檢視tcp 連線
 b 檢視udp 連線
 c 找到使用某個埠的程式
   # lsof -i :3306
   :3306和-i選項組合可以讓lsof列出佔用TCP或UDP的25埠的程式。
 
 d 找到使用某個udp埠號的程式
   # lsof -i udp:53
 e 可以找到使用某個tcp埠的程式:
   # lsof -i tcp:80
 f 找到某個使用者的所有網路連線
   # lsof -a -u mysql -i
   [root@rac1 ~]# lsof -a -u mysql -i
   COMMAND   PID  USER   FD   TYPE   DEVICE SIZE NODE NAME
   mysqld  24319 mysql   11u  IPv6 48586515       TCP rac1:mysql->rac1:39045 (ESTABLISHED)
   mysqld  24319 mysql   14u  IPv6 44743908       TCP *:mysql (LISTEN)
9 列出所有NFS(網路檔案系統)檔案
   # lsof -N
   這個引數很好記,-N就對應NFS。

10 列出所有對應某個組id的程式
   # lsof -g 1234
   程式組用來來邏輯上對程式進行分組,這個例子查詢所有PGID為1234的程式開啟的檔案。
11 列出所有與某個描述符關聯的檔案
   # lsof -d 2   會列出所有以描述符2開啟的檔案。
   可以為描述符指定一個範圍:
   # lsof -d 0-2 會列出所有描述符為0,1,2的檔案。
   -d選項還支援其它很多特殊值,下面的命令列出所有記憶體對映檔案:
   # lsof -d mem
   txt則列出所有載入在記憶體中並正在執行的程式:
   # lsof -d txt
12 輸出使用某些資源的程式pid
   # lsof -t -i
   -t選項輸出程式的PID,你可以將它和-i選項組合輸出使用某個埠的程式的PID,下面的命令將會殺掉所有使用網路的程式:
   # kill -9 `lsof -t -i`
13  迴圈列出檔案
  # lsof -r 1
   -r選項讓lsof可以迴圈列出檔案直到被中斷,引數1的意思是每秒鐘重複列印一次,這個選項最好同某個範圍比較小的查詢組合使用,比如用來監測網路活動:
  # lsof -r 1 -u john -i -a