lsof命令
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。
语法
lsof(选项)
参数
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
使用
查看
lsof -i:(端口) 查看这个端口有那些进程在访问,比如22端口
shell>lsof-i:22COMMANDPIDUSERFDTYPEDEVICESIZE/OFFNODENAMEsshd1939root3uIPv4123170t0TCP*:ssh(LISTEN)sshd1939root4uIPv6123210t0TCP*:ssh(LISTEN)sshd2790root3uIPv4152290t0TCP192.168.178.128:ssh->192.168.178.1:64601(ESTABLISHED)sshd2824root3uIPv4155280t0TCP192.168.178.128:ssh->192.168.178.1:64673(ESTABLISHED)sshd2990root3uIPv4159840t0TCP192.168.178.128:ssh->192.168.178.1:64686(ESTABLISHED)sshd14695root3uIPv4395580t0TCP192.168.178.128:ssh->192.168.178.1:49662(ESTABLISHED)
lsof输出各列信息的意义如下:
COMMAND:进程的名称PID:进程标识符USER:进程所有者FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等TYPE:文件类型,如DIR、REG等DEVICE:指定磁盘的名称SIZE:文件的大小NODE:索引节点(文件在磁盘上的标识)NAME:打开文件的确切名称
恢复文件
利用lsof可以恢复一些系统日志,前提是这个进程必须存在。这里就拿最常用的/var/log/messages来举例说明,大家在做测试的时候最好先备份一下。
#备份shell>cp/var/log/message/var/log/message_bac/shell>lsof|grep/var/log/messagersyslogd1737root1wREG8,25716123652638/var/log/messages
进程在运行中,接下来我就把/var/log/messages这个文件删掉
shell>rm/var/log/messages
删掉之后,我再来看看这个进程的变化
shell>lsof|grep/var/log/messagesrsyslogd1737root1wREG8,25716123652638/var/log/messages(deleted)
大家看到有变化了吧, 对比两个之后发现多了(deleted)。要找到这个文件在哪还要看看这个
PID:1737 FD:1 那我们有直接进入/proc/1737/FD/1用ll查看一下
shell>cd/proc/1737/fd/shell>lltotal0lrwx------1rootroot64Dec2313:000->socket:[11442]l-wx------1rootroot64Dec2313:001->/var/log/messages(deleted)l-wx------1rootroot64Dec2313:002->/var/log/securelr-x------1rootroot64Dec2313:003->/proc/kmsgl-wx------1rootroot64Dec2313:004->/var/log/maillog
看到了1对应/var/log/messages (deleted),看看文件是不是我们要的文件:
shell>head-51Nov1403:11:11localhostkernel:imklog5.8.10,logsource=/proc/kmsgstarted.Nov1403:11:11localhostrsyslogd:[originsoftware="rsyslogd"swVersion="5.8.10"x-pid="1241"x-info=""]startNov1403:11:11localhostkernel:InitializingcgroupsubsyscpusetNov1403:11:11localhostkernel:InitializingcgroupsubsyscpuNov1403:11:11localhostkernel:Linuxversion2.6.32-431.el6.x86_64(mockbuild@c6b8.bsys.)(gccversion4.4.70313(RedHat4.4.7-4)(GCC))#1SMPFriNov2203:15:09UTC
对比备份文件:
shell>head-5/var/log/message_bacNov1403:11:11localhostkernel:imklog5.8.10,logsource=/proc/kmsgstarted.Nov1403:11:11localhostrsyslogd:[originsoftware="rsyslogd"swVersion="5.8.10"x-pid="1241"x-info=""]startNov1403:11:11localhostkernel:InitializingcgroupsubsyscpusetNov1403:11:11localhostkernel:InitializingcgroupsubsyscpuNov1403:11:11localhostkernel:Linuxversion2.6.32-431.el6.x86_64(mockbuild@c6b8.bsys.)(gccversion4.4.70313(RedHat4.4.7-4)(GCC))#1SMPFriNov2203:15:09UTC
对比发现数据是一样的,恢复
shell>cat1>/var/log/messages
再次提醒,恢复前提是这个进程必须存在。
本文作者:佚名 来源:51CTO