lsof(list open file)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
1.命令格式
lsof [参数][文件]
2.命令功能
用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为 lsof 需要访问核心内存和各种文件,所以需要root用户执行。
lsof打开的文件可以是:
- 普通文件
目录
网络文件系统的文件
字符或设备文件
(函数)共享库
管道,命名管道
符号链接
网络文件(例如:NFS file、网络socket,unix域名socket)
还有其它类型的文件,等等
3. 命令参数
-a 列出打开文件存在的进程
-c<进程名> 列出指定进程所打开的文件
-g 列出GID号进程详情
-d<文件号> 列出占用该文件号的进程
+d<目录> 列出目录下被打开的文件
+D<目录> 递归列出目录下被打开的文件
-n<目录> 列出使用NFS的文件
-i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号> 列出指定进程号所打开的文件
-u 列出UID号进程详情
-h 显示帮助信息
-v 显示版本信息
4. 使用实例
- 无任何参数
lsof
说明
- COMMAND 进程的名称
PID 进程标识符
PPID 父进程标识符(需要指定-R参数)
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:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(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:网际协议 (IP) 套接字
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
- 查看谁正在使用某个文件,也就是说查找某个文件相关的进程
lsof /bin/bash
- 递归查看某个目录的文件信息
lsof +D /bin
- 关键字查找
lsof | grep 'mysql'
- 列出某个用户打开的文件信息
lsof -u www
- 列出某个进程名打开的文件信息
lsof -c php-fpm
- 列出某个进程号打开的文件信息
lsof -p 21996
- 根据文件描述列出对应的文件信息
lsof -d 1
- 列出特定tcp端口
lsof -i tcp:80
- 列出某个用户的所有活跃的网络端口
lsof -a -u www -i
5.调试php脚本
- 首先获取进程ID
ps -aux | grep QueryABC.php
sync360 11115 0.0 0.0 6564 864 ? Ss 14:00 0:00 /bin/sh -c /usr/local/bin/php /home/QueryABC.php BILL99DF 10-8>> /home
sync360 11124 0.0 0.4 361628 17296 ? S 14:00 0:04 /usr/local/bin/php /home/QueryABC.php BILL99DF 10-8
sync360 25230 0.0 0.0 63384 872 pts/0 S+ 15:28 0:00 grep QueryABC.php
- strace 查看该进程正在持续的状态
sudo strace -T -tt -e trace=all -p 11124
[sudo] password for ancongcong:
Process 11124 attached - interrupt to quit
15:33:07.259044 read(9,
- lsof查看进程所有使用的文件
lsof -p 11124
....
php 11124 sync360 mem REG 8,1 23736 3211320 /lib64/libnss_dns-2.5.so
php 11124 sync360 0r FIFO 0,6 1522728709 pipe
php 11124 sync360 1w REG 8,1 4088819 1869737 /home/logs/QueryABC.log
php 11124 sync360 2w FIFO 0,6 1522728710 pipe
php 11124 sync360 3w CHR 1,3 982 /dev/null
php 11124 sync360 4u IPv4 1522728838 TCP 211.151.122.234:46004->10.117.128.47:rtmp-port (CLOSE_WAIT)
php 11124 sync360 5wW REG 8,1 0 2704363 /home/lockfile/QueryABC.php.BILL99DF.10-8
php 11124 sync360 6u IPv4 1522728841 TCP 211.151.122.234:51019->10.117.128.46:rtmp-port (CLOSE_WAIT)
php 11124 sync360 7w REG 8,1 31960384 1869789 /home/logs/XXXX_info.log.20180118
php 11124 sync360 8w REG 8,1 18151722 1869806 /home/logs/XXXX_QRY_info.log.20180118
php 11124 sync360 9u IPv4 1522729884 TCP 211.151.122.234:54976->61.152.114.130:https (ESTABLISHED)
sudo netstat -tunpa | grep 11124
tcp 0 0 211.151.122.234:54976 61.152.114.130:443 ESTABLISHED 11124/php
tcp 1 0 211.151.122.234:51019 10.117.128.46:3500 CLOSE_WAIT 11124/php
tcp 1 0 211.151.122.234:46004 10.117.128.47:3500 CLOSE_WAIT 11124/php
可以发现最终是停留在 https 的链接建立,等待获取数据,查看此处代码 :
ini_set('default_socket_timeout',30);
$scOptions = array('connection_timeout' => 30);
$clientObj = new SoapClient( $wsdl , $scOptions);
当前版本 php 较老,这里是有个 bug 的在 https 链接请求时 SOAPClient 的超时时间是不生效。导致一直连接不释放,当请求量上来的时候,会导致服务器陷入高负载状态。
6. 查询php进程状态
所谓状态,指的是我们在启动 PHP 的时候,PHP-FPM 加载的系统库、PHP 扩展、以及其他日志文件等的状态信息。
- 查询php-fpm进程的PID
[root@localhost ~]# ps -aux|grep php-fpm
root 1544 0.0 0.8 291448 16244 ? Ss Jul30 0:06 php-fpm: master process
www 1545 0.0 0.9 291920 17340 ? S Jul30 0:00 php-fpm: pool www
www 1546 0.0 0.9 292136 17856 ? S Jul30 0:00 php-fpm: pool www
www 1547 0.0 0.9 291908 17336 ? S Jul30 0:00 php-fpm: pool www
www 1548 0.0 0.9 291916 17308 ? S Jul30 0:00 php-fpm: pool www
www 1549 0.0 0.9 292272 17880 ? S Jul30 0:00 php-fpm: pool www
www 1550 0.0 0.9 292616 18132 ? S Jul30 0:00 php-fpm: pool www
......
- 查询进程状态
[root@localhost ~]# lsof -p 1544
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 1544 root cwd DIR 253,0 271 64 /
php-fpm 1544 root rtd DIR 253,0 271 64 /
php-fpm 1544 root txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm
php-fpm 1544 root mem REG 253,0 62184 482957 /usr/lib64/libnss_files-2.17.so
php-fpm 1544 root mem REG 253,0 4194305 16881237 /tmp/phptrace.ctrl
php-fpm 1544 root mem REG 253,0 1850464 41259 /usr/lib64/libdb-5.3.so
php-fpm 1544 root mem REG 253,0 28216 33654797 /usr/lib64/sasl2/libsasldb.so.3.0.0
php-fpm 1544 root mem REG 253,0 19968 33654794 /usr/lib64/sasl2/libanonymous.so.3.0.0
php-fpm 1544 root DEL REG 0,4 18634 /dev/zero
php-fpm 1544 root mem REG 253,0 159600 51987804 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/trace.so
php-fpm 1544 root mem REG 253,0 4414480 50968175 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/mongodb.so
php-fpm 1544 root mem REG 253,0 851128 50666307 /usr/local/lib/libevent_core-2.1.so.6.0.2
php-fpm 1544 root mem REG 253,0 502032 50666311 /usr/local/lib/libevent_extra-2.1.so.6.0.2
php-fpm 1544 root mem REG 253,0 116088 50666319 /usr/local/lib/libevent_openssl-2.1.so.6.0.2
php-fpm 1544 root mem REG 253,0 883440 52435182 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/event.so
php-fpm 1544 root mem REG 253,0 121320 41640 /usr/lib64/libsasl2.so.3.0.0
php-fpm 1544 root mem REG 253,0 5662520 51023034 /usr/local/lib/librdkafka.so.1
php-fpm 1544 root mem REG 253,0 440512 51861780 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/rdkafka.so
php-fpm 1544 root mem REG 253,0 4408400 50919001 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/swoole.so
php-fpm 1544 root mem REG 253,0 1426032 52419266 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/yaf.so
php-fpm 1544 root mem REG 253,0 3618280 51005421 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/fileinfo.so
php-fpm 1544 root mem REG 253,0 1734168 52419246 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/redis.so
php-fpm 1544 root mem REG 253,0 1310320 51861871 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/xdebug.so
php-fpm 1544 root mem REG 253,0 1631520 51851520 /usr/local/php71/lib/php/extensions/no-debug-non-zts-20160303/opcache.so
php-fpm 1544 root mem REG 253,0 106070960 50918862 /usr/lib/locale/locale-archive
php-fpm 1544 root mem REG 253,0 402384 41228 /usr/lib64/libpcre.so.1.2.0
php-fpm 1544 root mem REG 253,0 155784 264930 /usr/lib64/libselinux.so.1
php-fpm 1544 root mem REG 253,0 15688 43432 /usr/lib64/libkeyutils.so.1.5
php-fpm 1544 root mem REG 253,0 58728 1528050 /usr/lib64/libkrb5support.so.0.1
php-fpm 1544 root mem REG 253,0 210840 44058 /usr/lib64/libk5crypto.so.3.1
php-fpm 1544 root mem REG 253,0 15848 1299 /usr/lib64/libcom_err.so.2.1
php-fpm 1544 root mem REG 253,0 963576 177761 /usr/lib64/libkrb5.so.3.3
php-fpm 1544 root mem REG 253,0 320408 1349437 /usr/lib64/libgssapi_krb5.so.2.2
php-fpm 1544 root mem REG 253,0 157424 1300 /usr/lib64/liblzma.so.5.2.2
php-fpm 1544 root mem REG 253,0 144792 524665 /usr/lib64/libpthread-2.17.so
php-fpm 1544 root mem REG 253,0 19384 41444 /usr/lib64/libgpg-error.so.0.10.0
php-fpm 1544 root mem REG 253,0 535064 41239 /usr/lib64/libgcrypt.so.11.8.2
php-fpm 1544 root mem REG 253,0 11464 1231 /usr/lib64/libfreebl3.so
php-fpm 1544 root mem REG 253,0 2173512 1485 /usr/lib64/libc-2.17.so
php-fpm 1544 root mem REG 253,0 88720 1499604 /usr/lib64/libgcc_s-4.8.5-20150702.so.1
php-fpm 1544 root mem REG 253,0 1419360 51389508 /usr/local/lib/libiconv.so.2.6.0
php-fpm 1544 root mem REG 253,0 258344 1577528 /usr/lib64/libxslt.so.1.1.28
php-fpm 1544 root mem REG 253,0 57136 1579626 /usr/lib64/libicuio.so.50.1.2
php-fpm 1544 root mem REG 253,0 20789896 1579622 /usr/lib64/libicudata.so.50.1.2
php-fpm 1544 root mem REG 253,0 1539392 1579636 /usr/lib64/libicuuc.so.50.1.2
php-fpm 1544 root mem REG 253,0 2096056 1579624 /usr/lib64/libicui18n.so.50.1.2
php-fpm 1544 root mem REG 253,0 691736 1349410 /usr/lib64/libfreetype.so.6.10.0
php-fpm 1544 root mem REG 253,0 472672 51303927 /usr/local/lib/libcurl.so.4.4.0
php-fpm 1544 root mem REG 253,0 2512832 1528053 /usr/lib64/libcrypto.so.1.0.2k
php-fpm 1544 root mem REG 253,0 470360 1528055 /usr/lib64/libssl.so.1.0.2k
php-fpm 1544 root mem REG 253,0 1509376 41480 /usr/lib64/libxml2.so.2.9.1
php-fpm 1544 root mem REG 253,0 117680 482950 /usr/lib64/libnsl-2.17.so
php-fpm 1544 root mem REG 253,0 1139680 177756 /usr/lib64/libm-2.17.so
php-fpm 1544 root mem REG 253,0 285296 5399 /usr/lib64/libjpeg.so.62.1.0
php-fpm 1544 root mem REG 253,0 179296 5419 /usr/lib64/libpng15.so.15.13.0
php-fpm 1544 root mem REG 253,0 995840 1337428 /usr/lib64/libstdc++.so.6.0.19
php-fpm 1544 root mem REG 253,0 19776 858 /usr/lib64/libdl-2.17.so
php-fpm 1544 root mem REG 253,0 662504 50758820 /usr/local/lib/libmcrypt.so.4.4.8
php-fpm 1544 root mem REG 253,0 44448 1254 /usr/lib64/librt-2.17.so
php-fpm 1544 root mem REG 253,0 106848 524736 /usr/lib64/libresolv-2.17.so
php-fpm 1544 root mem REG 253,0 87368 1577526 /usr/lib64/libexslt.so.0.8.17
php-fpm 1544 root mem REG 253,0 90664 41257 /usr/lib64/libz.so.1.2.7
php-fpm 1544 root mem REG 253,0 41080 854 /usr/lib64/libcrypt-2.17.so
php-fpm 1544 root mem REG 253,0 164240 1517336 /usr/lib64/ld-2.17.so
php-fpm 1544 root DEL REG 0,4 20579 /dev/zero
php-fpm 1544 root 0u CHR 1,3 0t0 1028 /dev/null
php-fpm 1544 root 1u CHR 1,3 0t0 1028 /dev/null
php-fpm 1544 root 2w REG 253,0 1998396 36911463 /usr/local/php71/var/log/php71-fpm.log
php-fpm 1544 root 3w REG 253,0 1998396 36911463 /usr/local/php71/var/log/php71-fpm.log
php-fpm 1544 root 4u unix 0xffff886c38c9c000 0t0 20580 socket
php-fpm 1544 root 5r FIFO 0,9 0t0 20585 pipe
php-fpm 1544 root 6u unix 0xffff886c38c9d400 0t0 20581 socket
php-fpm 1544 root 7u unix 0xffff886c38c9c800 0t0 20582 /dev/shm/php71-cgi.sock
php-fpm 1544 root 8u a_inode 0,10 0 6123 [eventpoll]
通过以上信息,我们可以明确知道我们的这个进程对应的 PHP-FPM 的绝对路径。以及它加载了系统的哪些类库,和加载了 PHP 的哪些类库。
php-fpm 1544 root 0u CHR 1,3 0t0 1028 /dev/null
php-fpm 1544 root 1u CHR 1,3 0t0 1028 /dev/null
php-fpm 1544 root 2w REG 253,0 1998396 36911463 /usr/local/php71/var/log/php71-fpm.log
通过此项,我们可以看到,标准输出(0u)丢弃了(/dev/null)。标准转入(1u)也丢弃了(/dev/null)。标准的错误(2w)转出到了 /usr/local/php71/var/log/php71-fpm.log 文件。