zoukankan      html  css  js  c++  java
  • lsof指令使用简介

    lsof替代了netstat和ps的全部工作。它可以带来那些工具所能带来的一切,而且要比那些工具多得多

    最重要的是,当你给它传递选项时,默认行为是对结果进行“或”运算。因此,如果是用-i来拉出一个端口列表,同时又用-p来拉出一个进程列表,那么默认情况下你会获得两者的结果。


    lsof打开的文件可以是:
    1.普通文件
    2.目录
    3.网络文件系统的文件
    4.字符或设备文件
    5.(函数)共享库
    6.管道,命名管道
    7.符号链接
    8.网络文件(例如:NFS file、网络socket,unix域名socket)
    9.还有其它类型的文件,等等


    下面的一些其它东西需要牢记:

    默认 : 没有选项,lsof列出活跃进程的所有打开文件
    组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数

    -a 结果进行“与”运算(而不是“或”,默认是“或”运算)
    -l 默认显示用户名,使用-l显示UID


    -U 列出UNIX域套接字文件
    -u USER 列出USER用户打开哪些文件
    -p PID 列出进程号为PID的进程打开了哪些文件
    -c httpd 列出指定进程所打开的文件
    -g PGID 查看进程组ID为PGID打开的文件
    +d <目录> 列出目录下被打开的文件
    +D <目录> 递归列出目录下被打开的文件

    -d <FD类型> cwd、txt、mem等(见下文),对列出的内容根据FD类型进行过滤,^表示取反,数字可使用0-9表示范围

    -i <条件> 列出符合条件的进程。(4、6、协议<tcp|udp>、:端口、 @ip ),该选项可以替代netstat指令
    -P 配合-i使用,显示端口号,而不显示服务名,必须放在-i选项之前
    -n 配合-i使用,显示IP,而不显示主机名,必须放在-i选项之前
    如:
    lsof -nPi

    -s UDP|TCP:LISTEN|... 按照协议以及连接状态过滤
    -t 仅列出进程PID


    -F : 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止)


    -i 显示所有连接的情况
    -i 6 仅获取IPv6流量
    -i tcp 仅显示TCP连接
    -i udp 仅显示UDP连接
    -i :PORT 来显示与指定端口相关的网络信息
    -i :服务名 如-i :http 等同于-i :PORT
    -i @HOST 来显示指定到指定主机的连接
    -i @HOST:PORT 显示基于主机与端口的连接
    -i -sTCP:LISTEN <==> lsof -i | grep -i LISTEN 找出正等候连接的端口
    lsof -i -sTCP:ESTABLISHED <==> lsof -i | grep -i ESTABLISHED 找出已经建立连接的端口


    lsof |grep deleted #查找已经被删除但仍未释放的文件(文件仍然被程序占用)


    [root@http22 ~]# lsof -i:80
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    httpd 1310 root 4u IPv6 10939 0t0 TCP *:http (LISTEN)
    httpd 2992 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)
    httpd 2993 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)
    httpd 2994 apache 4u IPv6 10939 0t0 TCP *:http (LISTEN)


    每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。
    lsof输出各列信息的意义如下:
    COMMAND:进程的名称
    PID:进程标识符
    USER:进程所有者
    FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
    TYPE:文件类型,如DIR、REG等
    DEVICE:指定磁盘的名称
    SIZE:文件的大小
    NODE:索引节点(文件在磁盘上的标识)
    NAME:打开文件的确切名称或服务名


    FD列中的文件描述:
    FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
    (1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
    (2)txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
    (3)lnn:library references (AIX);
    (4)er:FD 信息错误 (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合并映射文件;
    (9)mem:内存映射文件
    (10)mmap:内存映射设备
    (11)pd:父目录
    (12)rtd:根目录
    (13)tr:核心跟踪文件 (OpenBSD);
    (14)v86 VP/ix 映射文件;
    (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) 套接字

    恢复删除文件
    当系统中的某个文件被意外删除了,只要这个时候系统中有进程正在访问这个文件,那么可以通过lsof 从/proc目录下恢复文件的内容
    假如/var/log/messages文件被删了,恢复这个文件的方法:

    首先使用lsof 查看当前是否有进程打开/var/log/messages文件,
    lsof |grep /var/log/messages
    [root@localhost ~]# rm /var/log/messages
    rm:是否删除普通文件 "/var/log/messages"?y
    [root@localhost ~]# lsof |grep /var/log/messages
    rsyslogd 5925 root 1w REG 8,2 4369 266184 /var/log/messages (deleted)

    从上面的信息可以看到PID 5925(syslogd)打开文件的文件描述符为1,同时发现/var/log/messages已经被删除了。
    因此可以通过/var/log/messages文件描述符来查看文件信息。
    cat /pro/5925/fd/1

    最后通过重定向的方法恢复被删除的/var/log/messages
    cat /pro/5925/fd/1 > /var/log/messages

  • 相关阅读:
    常用的字符集编码
    live555—VS2010/VS2013 下live555编译、使用及测试(转载)
    win32下Socket编程(转载)
    do{...}while(0)的意义和用法(转载)
    C++ static与单例模式
    MFC多线程各种线程用法 .
    a^1+b problem
    重返现世——题解
    第K大C
    懒癌
  • 原文地址:https://www.cnblogs.com/wyzhou/p/9292700.html
Copyright © 2011-2022 走看看