lsof能显示出由系统里正在运行的进程所打开的文件,也能显示出每一个进程的通讯socket.
下面,lsof的用法总结:
1、查看文件系统阻塞
lsof 目录名 可以查看还有哪些进程在使用这个目录,例:
当一个用户以oracle的身份telnet到服务器,那么用lsof /home/oracle 就可以看到它的进程号.
[root@vm4 ~]# lsof /home/oracle
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
tnslsnr 2709 oracle cwd DIR 8,3 4096 1087047 /home/oracle
bash 3827 oracle cwd DIR 8,3 4096 1087047 /home/oracle
2、搜索打开的网络连接
搜索某个ip打开的所有网络连接:
我从一个windows客户端用sqlplus连接服务器,在服务器上可以看到:
[root@vm4 ~]# lsof -i@192.168.5.168
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 3354 root 3u IPv6 9276 TCP 192.168.2.134:ssh->192.168.5.168:2030 (ESTABLISHED)
sshd 3356 oracle 3u IPv6 9276 TCP 192.168.2.134:ssh->192.168.5.168:2030 (ESTABLISHED)
oracle 3860 oracle 13u IPv4 12962 TCP 192.168.2.134:1521->192.168.5.168:2372 (ESTABLISHED)
其中前2个是telnet的链接,第3个是sqlplus的链接,端口是2372
3、寻找本地断开的打开文件
lsof +L1
4、搜索被程序打开的所有文件及打开的文件相关联进程
我在windows的机器上sqlplus连接一个linux上面的oracle10g,在linux上面会有一个process作为我的链接的server process.
ps看一下:
[root@vm4 ~]# ps -ef | grep oracle
oracle 2709 1 0 20:17 ? 00:00:00 /u01/oracle/product/10.2.0/db_1/bin/tnslsnr LISTENER -inherit
root 3354 2218 0 20:33 ? 00:00:00 sshd: oracle [priv]
oracle 3356 3354 0 20:34 ? 00:00:00 sshd: oracle@pts/1
oracle 3357 3356 0 20:34 pts/1 00:00:00 -bash
oracle 3390 1 0 20:35 ? 00:00:00 ora_pmon_rawdb
oracle 3392 1 0 20:35 ? 00:00:00 ora_psp0_rawdb
oracle 3394 1 0 20:35 ? 00:00:00 ora_mman_rawdb
oracle 3396 1 0 20:35 ? 00:00:00 ora_dbw0_rawdb
oracle 3398 1 0 20:35 ? 00:00:00 ora_lgwr_rawdb
oracle 3400 1 0 20:35 ? 00:00:00 ora_ckpt_rawdb
oracle 3402 1 0 20:35 ? 00:00:00 ora_smon_rawdb
oracle 3404 1 0 20:35 ? 00:00:00 ora_reco_rawdb
oracle 3406 1 0 20:35 ? 00:00:00 ora_cjq0_rawdb
oracle 3408 1 0 20:35 ? 00:00:01 ora_mmon_rawdb
oracle 3410 1 0 20:35 ? 00:00:00 ora_mmnl_rawdb
oracle 3414 1 0 20:35 ? 00:00:00 ora_qmnc_rawdb
oracle 3420 1 0 20:35 ? 00:00:00 ora_q000_rawdb
oracle 3422 1 0 20:35 ? 00:00:00 ora_q001_rawdb
oracle 3464 1 1 20:38 ? 00:00:00 oraclerawdb (LOCAL=NO)
root 3499 3466 0 20:39 pts/1 00:00:00 grep oracle
3464就是那个为我的客户端服务的server process的进程号.用lsof来看看他使用的文件和通讯端口.
lsof -p 3464
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
oracle 3464 oracle cwd DIR 8,3 4096 1184867 /u01/oracle/product/10.2.0/db_1/dbs
oracle 3464 oracle rtd DIR 8,3 4096 2 /
oracle 3464 oracle txt REG 8,3 86175221 551701 /u01/oracle/product/10.2.0/db_1/bin/oracle
oracle 3464 oracle mem REG 8,3 106441 391214 /lib/ld-2.3.4.so
oracle 3464 oracle mem REG 8,3 1451681 391215 /lib/tls/libc-2.3.4.so
oracle 3464 oracle mem REG 8,3 15340 391217 /lib/libdl-2.3.4.so
oracle 3464 oracle mem REG 8,3 178307 391216 /lib/tls/libm-2.3.4.so
oracle 3464 oracle mem REG 8,3 93993 391218 /lib/tls/libpthread-2.3.4.so
oracle 3464 oracle mem REG 8,3 95192 391226 /lib/libnsl-2.3.4.so
oracle 3464 oracle DEL REG 0,6 163841 /SYSV9a02403c
oracle 3464 oracle mem CHR 1,5 1608 /dev/zero
oracle 3464 oracle mem REG 8,3 45816 389426 /lib/libnss_files-2.3.4.so
oracle 3464 oracle mem REG 8,3 2628 696392 /usr/lib/libaio.so.1.0.1
oracle 3464 oracle mem REG 8,3 5480533 1188614 /u01/oracle/product/10.2.0/db_1/lib/libnnz10.so
oracle 3464 oracle mem REG 8,3 98079 1187068 /u01/oracle/product/10.2.0/db_1/lib/libdbcfg10.so
oracle 3464 oracle mem REG 8,3 70077 1188456 /u01/oracle/product/10.2.0/db_1/lib/libclsra10.so
oracle 3464 oracle mem REG 8,3 9017903 1185770 /u01/oracle/product/10.2.0/db_1/lib/libjox10.so
oracle 3464 oracle mem REG 8,3 728411 1188452 /u01/oracle/product/10.2.0/db_1/lib/libocrutl10.so
oracle 3464 oracle mem REG 8,3 1211519 1188451 /u01/oracle/product/10.2.0/db_1/lib/libocrb10.so
oracle 3464 oracle mem REG 8,3 854560 1188450 /u01/oracle/product/10.2.0/db_1/lib/libocr10.so
oracle 3464 oracle mem REG 8,3 8069 1187147 /u01/oracle/product/10.2.0/db_1/lib/libskgxn2.so
oracle 3464 oracle mem REG 8,3 2365801 1188455 /u01/oracle/product/10.2.0/db_1/lib/libhasgen10.so
oracle 3464 oracle mem REG 8,3 143485 113871 /u01/oracle/product/10.2.0/db_1/lib/libskgxp10.so
oracle 3464 oracle 0u CHR 1,3 1607 /dev/null
oracle 3464 oracle 1u CHR 1,3 1607 /dev/null
oracle 3464 oracle 2u CHR 1,3 1607 /dev/null
oracle 3464 oracle 3r REG 0,1 955 34 /init
oracle 3464 oracle 4r CHR 1,3 1607 /dev/null
oracle 3464 oracle 5r CHR 1,3 1607 /dev/null
oracle 3464 oracle 6r CHR 1,3 1607 /dev/null
oracle 3464 oracle 7r CHR 1,3 1607 /dev/null
oracle 3464 oracle 8r CHR 1,5 1608 /dev/zero
oracle 3464 oracle 9r REG 8,3 834560 568806 /u01/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
oracle 3464 oracle 10u CHR 162,10 5795 /dev/raw/raw10
oracle 3464 oracle 11u CHR 162,6 5682 /dev/raw/raw6
oracle 3464 oracle 12r REG 8,3 584704 568815 /u01/oracle/product/10.2.0/db_1/rdbms/mesg/orazhs.msb
oracle 3464 oracle 13u IPv4 9944 TCP 192.168.2.134:1521->192.168.5.168:2057 (ESTABLISHED)
oracle 3464 oracle 14r REG 8,3 834560 568806 /u01/oracle/product/10.2.0/db_1/rdbms/mesg/oraus.msb
其中:
oracle 3464 oracle 13u IPv4 9944 TCP 192.168.2.134:1521->192.168.5.168:2057 (ESTABLISHED)
说明了这个server process 这在用tcpip链接我机器的2057端口.
其它信息表明了他所使用的文件.
5、 其它使用命令
-c c 显示出以字母 c开头进程现在打开的文件
例:显示以init进程现在打开的文件
[root@vm4 ~]# lsof -c init
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 32684 324537 /sbin/init
init 1 root mem REG 8,3 106441 391214 /lib/ld-2.3.4.so
init 1 root mem REG 8,3 1451681 391215 /lib/tls/libc-2.3.4.so
init 1 root mem REG 8,3 53736 389497 /lib/libsepol.so.1
init 1 root mem REG 8,3 56320 391229 /lib/libselinux.so.1
init 1 root 3r REG 0,1 955 34 /init
init 1 root 10u FIFO 0,13 1094 /dev/initctl