linux命令-lsof

    技术2022-07-12  93

    简单来讲  lsof是一个可以查看进程打开文件的情况的命令   日常运维工作中 使用到的场景有很多

    而之所以lsof命令这么强大 就是因为在linux中  一切皆文件

    简单介绍

    命令安装:

    如果你的linux没有lsof命令  yum install lsof  安装就好

    参数介绍:

    默认 : 没有选项,lsof列出活跃进程的所有打开文件 组合 : 可以将选项组合到一起,如-abc,但要当心哪些选项需要参数 -a 列出打开文件存在的进程 -c<进程名> 列出指定进程所打开的文件 -g 列出GID号进程详情 -d<文件号> 列出占用该文件号的进程 +d<目录> 列出目录下被打开的文件 +D<目录> 递归列出目录下被打开的文件 -n<目录> 列出使用NFS的文件 -i<条件> 列出符合条件的进程。(4、6、协议、:端口、 @ip ) -p<进程号> 列出指定进程号所打开的文件 -u 列出UID号进程详情 -h 显示帮助信息 -v 显示版本信息 -t 仅获取进程ID -F 格式化输出结果,用于其它命令。可以通过多种方式格式化,如-F pcfn(用于进程id、命令名、文件描述符、文件名,并以空终止) -l 在输出显示用户ID而不是用户名 -U 获取UNIX套接口地址

    输出介绍

    【command】进程名称/命令

    【pid】进程id

    【tid】线程id

    【user】进程所有者

    【fd】文件描述符

    cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录 txt:该类型的文件是程序代码,如应用程序二进制文件本身或共享库 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:表示标准错误

    【type】文件类型

    DIR:表示目录 CHR:表示字符类型 BLK:块设备类型 UNIX:UNIX域套接字 FIFO:先进先出(FIFO)队列 IPv4:网际协议(IP)套接字

    【device】磁盘名称

    【size/off】文件大小

    【node】索引节点(文件在磁盘上的标识)

    【name】打开文件的确切名称

     

    使用场景

    【1】查看端口被哪个进程占用

    lsof -i:端口

    [root@localhost sbin]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 1087 root 6u IPv4 21571 0t0 TCP *:http (LISTEN) nginx 1088 nobody 6u IPv4 21571 0t0 TCP *:http (LISTEN) [root@localhost sbin]# lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 912 root 3u IPv4 18920 0t0 TCP *:ssh (LISTEN) sshd 912 root 4u IPv6 18929 0t0 TCP *:ssh (LISTEN) sshd 1044 root 3u IPv4 20554 0t0 TCP localhost.localdomain:ssh->192.168.30.1:51424 (ESTABLISHED) sshd 1048 root 3u IPv4 20616 0t0 TCP localhost.localdomain:ssh->192.168.30.1:51431 (ESTABLISHED)

    【2】恢复被删除的文件

    有时候 不小心删除了一个文件   lsof可以提供一个简单的恢复方法(前提是该文件被当前还在执行的进程打开)

    例如lsof_test.txt文件我不小心rm -rf 删除掉了  数据比较重要   lsof命令就是一个简单的可能恢复的选择

    这个时候 执行命令lsof |grep lsof_test.txt  发现另一个有人正在用less命令查看这个文件  并且可以看到最后位置的文件名称后面有个(deleted),说明这个文件已经被删除了,这个进程结束,文件就不能轻易恢复了,就需要更专业的操作

    查出来的信息,可以得到进程id,文件描述符

    这个时候我们就可以去 /proc/进程id/fd 下面找到这个文件了,如下面 这个4就是这个文件的副本(上面查到的文件描述符)

    然后 cat 4 >> /root/lsof_test.txt  就可以将文件内容导出  重新生成文件了

     

    【3】网络分析辅助:

    列出所有的TCP网络连接信息:lsof -i tcp

    列出80端口TCP协议的所有连接信息:lsof -i tcp:80

    列出相关IP的连接信息(也可以加端口):lsof -i @172.0.0.1

    (以上tcp也可换成udp)

    【4】关于用户

    列出指定用户打开的文件列表:lsof -u uasp -i tcp (可以看看某个用户都在干啥)

    杀掉指定用户运行的所有东西:kill -9 'lsof -t -u xxuser' 

    【5】其他

    列出指定进程(进程名)打开的文件:lsof -c nginx

    列出指定进程打开的文件列表:lsof -p 20711

    指定目录下(递归查询)被进程打开的文件列表:lsof +D /usr/local/

     

    后记

    lsof命令很强大    尤其是通过各种参数或者与其他linxu 命令组合   更显其强大

     

     

    Processed: 0.010, SQL: 9