简单来讲 lsof是一个可以查看进程打开文件的情况的命令 日常运维工作中 使用到的场景有很多
而之所以lsof命令这么强大 就是因为在linux中 一切皆文件
如果你的linux没有lsof命令 yum install lsof 安装就好
【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】打开文件的确切名称
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)有时候 不小心删除了一个文件 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 就可以将文件内容导出 重新生成文件了
列出所有的TCP网络连接信息:lsof -i tcp
列出80端口TCP协议的所有连接信息:lsof -i tcp:80
列出相关IP的连接信息(也可以加端口):lsof -i @172.0.0.1
(以上tcp也可换成udp)
列出指定用户打开的文件列表:lsof -u uasp -i tcp (可以看看某个用户都在干啥)
杀掉指定用户运行的所有东西:kill -9 'lsof -t -u xxuser'
列出指定进程(进程名)打开的文件:lsof -c nginx
列出指定进程打开的文件列表:lsof -p 20711
指定目录下(递归查询)被进程打开的文件列表:lsof +D /usr/local/