1 简介

lsof(list open files) 是一个列出当前系统打开文件的工具。

在 linux 环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过 lsof 工具能够查看这个列表对系统监测以及排错将是很有帮助的。

2 命令使用

lsof [选项] [绝对路径的文件名]

选项:

-a:列出打开文件存在的进程;

-c:列出指定进程所打开的文件;

-g:列出GID号进程详情;

-d:列出占用该文件号的进程;

+d:列出目录下被打开的文件;

+D:递归列出目录下被打开的文件;

-n:列出使用NFS的文件;

-i:列出符合条件的进程。(4、6、协议、:端口、 @ip )

-p:列出指定进程号所打开的文件;

-u:列出UID号进程详情;

-h:显示帮助信息;

-v:显示版本信息。

显示示例:

[root@localhost public]# lsof /usr/local/php71/sbin/php-fpm

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

php-fpm 1544 root txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1545 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1546 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1547 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1548 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1549 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

php-fpm 1550 www txt REG 253,0 40770864 1506860 /usr/local/php71/sbin/php-fpm

......

每行显示一个打开的文件,默认如果后面不跟任何东西,将打开系统打开的所有文件。

参数

说明

COMMAND

进程名称

PID

进程标识符

USER

进程所有者

FD

文件描述符,应用程序通过文件描述符识别到该文件。如 cwd、txt 等。

TYPE

文件类型,如 REG、DIR、CHR、BLK、UNIX、FIFO、IPV4。

DEVICE

指定磁盘名称

SIZE

文件大小。单位(字节)。

补充:FD 列中的文件描述 cwd 值表示应用程序的当前工作目录,这是该程序启动的目录,除非它本身对这个目录进行更改。txt 类型的是程序代码,如应用程序二进制文件本身或者共享库。其次数值表示应用程序的文件描述符,这是打开文件时一个返回的一个整数。

3 TYPE 说明

参数

说明

REG

文件。

DIR

目录。

CHR

字符设备。命令行终端。

BLK

块设备。如硬盘、内存。

UNIX

UNIX 域套接字。

FIFO

先进先出 (FIFO) 队列。

IPV4

网际协议 (IP) 套接字。

NODE

索引节点(文件在磁盘上的标识) 。

4 FD 说明

参数

说明

cwd

表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改 。

txt

该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序 。

lnn

library references (AIX)。

er

FD information error (see NAME column) 。

jld

jail directory (FreeBSD) 。

ltx

shared library text (code and data) 。

mxx

hex memory-mapped type number xx。

m86

DOS Merge mapped file。

mem

memory-mapped file。

mmap

memory-mapped device。

pd

parent directory。

rtd

root directory。

tr

kernel trace file (OpenBSD) 。

v86

VP/ix mapped file。

0

表示标准输出。

1

表示标准输入。

2

表示标准错误。

一般在标准输出、标准错误、标准输入后还跟着文件状态模式

参数

说明

u

表示该文件被打开并处于读取/写入模式。

r

表示该文件被打开并处于只读模式。

w

表示该文件被打开并处于写入模式。

空格

表示该文件的状态模式为 unknow,且没有锁定。

-

表示该文件的状态模式为 unknow,且被锁定。

5 调试 PHP

以下示例来源于网络整理。目的是解决进程卡死的情况。经验证,示例当中步骤以及命令无误。

5.1) 首先获取该进程 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

5.2) 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,

5.3) 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 扩展、以及其他日志文件等的状态信息。

6.1) 查询 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

......

可以获知我们的 PHP-FPM 主进程的 PID 为 1544。

6.2) 查询进程状态

[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 文件。

7 其它用法

7.1) 列出所有打开的文件:

lsof

备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位。通常我们不会这样直接用。

7.2) 查看谁正在使用某个文件:

lsof /usr/local/php53/var/log/php-fpm.log

7.3) 递归查看某个目录的文件信息:

lsof +D /usr/local/php53/var/log/

备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

7.4) 列出某个用户打开的文件信息

lsof -u www

备注: -u 选项,u 其实是 user 的缩写。该示例在笔者电脑上是列出 nginx/php-fpm 打开的文件信息。

7.5) 列出某个程序所打开的文件信息

lsof -c mysql

lsof -c php-fpm

备注: -c 选项将会列出所有以 mysql 开头的程序的文件。

7.6) 列出多个程序多打开的文件信息

lsof -c mysql -c apache

7.7) 列出某个用户以及某个程序所打开的文件信息

lsof -u root -c mysql

7.8) 列出除了某个用户外的被打开的文件信息

lsof -u ^root

备注:^这个符号在用户名之前,将会把是 root 用户打开的进程不让显示。

7.9) 通过某个进程号显示该进行打开的文件

lsof -p 进程 ID

7.10) 列出多个进程号对应的文件信息

lsof -p 进程ID,进程ID,进程ID

7.11) 列出除了某个进程号,其他进程号所打开的文件信息

lsof -p ^1

7.12) 列出所有的网络连接

lsof -i

7.13) 列出所有 tcp 网络连接信息

lsof -i tcp

7.14) 列出所有udp网络连接信息

lsof -i udp

7.15) 列出谁在使用某个端口

[root@localhost ~]# lsof -i :6379

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

redis-ser 1344 redis 4u IPv4 19521 0t0 TCP localhost:6379 (LISTEN)

7.16) 列出谁在使用某个特定的udp端口

lsof -i udp:55

7.17) 列出谁在使用某个特定的tcp端口

lsof -i tcp:80

7.18) 列出某个用户的所有活跃的网络端口

lsof -a -u root -i

7.19) 列出所有网络文件系统

lsof -N

7.20) 域名 socket 文件

lsof -u

8 总结

lsof 命令可以用来查看我们的进程打开的文件、目录、网络设置、网络连接等。在排查 PHP 性能问题的时候,可以起到一个直接或间接的佐证工具。让我们能快速定位问题并解决问题。

php-fpm dev zero,Linux lsof 调试 PHP相关推荐

  1. 第10章 嵌入式linux的调试技术

    一.      防止函数printk降低linux性能: 利用C语言中的编译指令(#if.#else.#endif等). 现在修改printk_demo驱动代码,通过编译指令定义了一个pr_debug ...

  2. Linux内核调试方法总结【转】

    转自:http://my.oschina.net/fgq611/blog/113249 内核开发比用户空间开发更难的一个因素就是内核调试艰难.内核错误往往会导致系统宕机,很难保留出错时的现场.调试内核 ...

  3. Linux内核调试方法总结

    [转]Linux内核调试方法总结 目录[-] 一  调试前的准备 二  内核中的bug 三  内核调试配置选项 1  内核配置 2  调试原子操作 四  引发bug并打印信息 1  BUG()和BUG ...

  4. Linux内核调试技术指南

    前两天,完成了ucos在2440上的移植,以及boot的修改.今天突然想到,我在linux下,该如何来编写,调试比较复杂的驱动.我想这个问题应该从如何调试内核入手,先转载两个文字,待西西看来. 系统搭 ...

  5. linux内核调试指南

    Hunnad的专栏 * 条新通知 * 登录 * 注册 * 欢迎 * 退出 * 我的博客 * 配置 * 写文章 * 文章管理 * 博客首页 * * * * 空间 * 博客 * 好友 * 相册 * 留言 ...

  6. Linux Kernel - Debug Guide (Linux内核调试指南 )

    linux内核调试指南 一些前言 作者前言 知识从哪里来 为什么撰写本文档 为什么需要汇编级调试 ***第一部分:基础知识*** 总纲:内核世界的陷阱 源码阅读的陷阱 代码调试的陷阱 原理理解的陷阱 ...

  7. arm架构linux内核调试实战

    前言 偶然间,发现了一个很好用的仓,可以十分方便地进行 arm 架构的 linux 内核调试,该仓地址如下 https://github.com/cc-droid/v-kernel-qemu ,对应的 ...

  8. linux lsof命令详解,linux lsof命令详解一切皆文件

    在linux下,"一切皆文件",任何事物都以文件的形式存在,lsof全称list open files,中文翻译列出当前系统打开文件, 以 root 用户的身份运行它才能够充分地发 ...

  9. Linux内核调试方法【转】

    转自:http://www.cnblogs.com/shineshqw/articles/2359114.html kdb:只能在汇编代码级进行调试: 优点是不需要两台机器进行调试. gdb:在调试模 ...

最新文章

  1. VLAN+DHCP(1)(附抓包)
  2. echarts一次渲染两个图_一次 Flutter WebView 性能优化
  3. v-modedl的修饰符
  4. 2019.07.11
  5. telnet 以及 win10 开放端口
  6. SAP Fiori应用里一些OData错误排查的最佳实践
  7. linux3.0-内核自带led驱动移植
  8. Android 申请权限结果返回处理
  9. 配置nginx-rtmp流媒体服务器(宝塔面板配置教程)
  10. 媒体转码切片_cVideo云转码系统
  11. 对模块开发卷宗的理解_【设计思维】quot;真quot;模块化根本就不需要读源码!...
  12. 支付宝弄了个“双12 ” 岛国民众都high了
  13. 跨平台开源集成开发环境Eclipse
  14. 一起学ORBSLAM2(9)ORBSLAM的PNP解决方案
  15. 网络工程师考试经验总结
  16. centos7 设置代理
  17. 详解C++中fixed,setprecision(),setw()的用法
  18. mac的python换字体_Python -mac-画图及设置坐标中文字体
  19. 苹果公司CEO:混蛋乔布斯
  20. SQL对date类型的操作

热门文章

  1. 为什么不管手机运行内存有多大,最后都不太够用?
  2. QQ空间照片上传HTML代码演示
  3. MTK平台camera bsp学习之android平台架构篇
  4. 文本数据标注平台-doccano安装使用教程
  5. 怎样生成CSR证书请求文件
  6. H.264/AVC 片——slice
  7. 数学难度越来越大,初二补习数学有必要吗?
  8. Nacos系列3---源码刨析naming服务的server列表核心管理类ServerListManager
  9. 测试金士顿固态硬盘软件,借装机之名测试SSD:金士顿的当红两款固态究竟如何?...
  10. LeetCode258 各位相加(弃九法)