lsof(list open files)
参数如下
-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。
我们知道,在Linux系统,一切皆文件。
进程每打开一个文件,就会有对应的文件描述符(FD),在/proc/[PID]/fd下有对应的文件描述符,对于哪个文件对应哪个文件描述符,我们可以使用lsof查看一下。
这里我们以我们的/var/log/messages为例,我们知道,这个文件保存我们的一些日志信息。
[root@master1 ~]# lsof |grep messages
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 1040 root 6w REG 253,0 1791635 74250200 /var/log/messages
in:imjour 1040 1062 root 6w REG 253,0 1791635 74250200 /var/log/messages
rs:main 1040 1065 root 6w REG 253,0 1791635 74250200 /var/log/messages
[root@master1 ~]#
我们可以看到它是由我们的rsyslogd这个日志守护进程打开的,然后我们看到它的PID是1040,FD是6,w表示可写。

这个6就是我们的/var/log/messages的文件描述符 
当然这里有个小技巧,就是当我们不小心删除了这个messages文件,也是可以同时上面的方式找回的。实操如下:
[root@master1 ~]# rm -rf /var/log/messages
注意:找回的前提是该文件被打开的那个进程一直都在,且未重启过。像我们已经删除了messages这个文件,但是rsyslogd这个进程一直都在
[root@master1 ~]# ps -ef |grep rsyslogd
root 1040 1 0 20:13 ? 00:00:03 /usr/sbin/rsyslogd -n
root 29645 6450 0 21:01 pts/0 00:00:00 grep --color=auto rsyslogd
并且我们lsof看一下这个messages,状态变成了deleted
[root@master1 ~]# lsof |grep messages
rsyslogd 1040 root 6w REG 253,0 2211093 74250200 /var/log/messages (deleted)
in:imjour 1040 1062 root 6w REG 253,0 2211093 74250200 /var/log/messages (deleted)
rs:main 1040 1065 root 6w REG 253,0 2211093 74250200 /var/log/messages (deleted)
[root@master1 ~]#
此时如何恢复呢?
就是拷贝我们刚才在proc目录下那个文件描述符即可
[root@master1 ~]# cp /proc/1040/fd/6 /var/log/messages
关于lsof的其他用法,可以百度一下,这个方面的学习资料还是蛮多了,像我自己目前用到最多就是查看网络端口占用的时候会losf -i :22 用一下,然后还有就是今天遇到一个奇怪的问题,顺便记录一下,就是有客户反应在装的系统中,/var/log/messages的内容为空,也就是说系统日志不知道跑到哪里去了。解决办法相当粗暴,就是那个日志进程没有起来而已,下面简单复现一下
[root@master1 ~]# rm -rf /var/run/syslogd.pid
[root@master1 ~]#
[root@master1 ~]#
[root@master1 ~]# vim /var/log/messages
[root@master1 ~]# cat /var/log/messages
1
[root@master1 ~]#
[root@master1 ~]# lsof |grep messages
[root@master1 ~]#
[root@master1 ~]# ps -ef |grep rsyslogd
root 36780 6450 0 21:15 pts/0 00:00:00 grep --color=auto rsyslogd
[root@master1 ~]#
[root@master1 ~]# systemctl start rsyslog.service
[root@master1 ~]# lsof |grep messages
rsyslogd 36914 root 6w REG 253,0 57553 70318199 /var/log/messages
in:imjour 36914 36916 root 6w REG 253,0 57553 70318199 /var/log/messages
rs:main 36914 36917 root 6w REG 253,0 57553 70318199 /var/log/messages
[root@master1 ~]#
本文介绍了Linux系统中lsof命令的使用,包括查看打开文件的进程、文件描述符以及如何恢复已删除但仍在使用的文件。通过实例展示了当/var/log/messages被删除时,如何找到并恢复该文件。此外,还提到了系统日志丢失的可能原因,即相关日志服务未启动,并演示了启动服务恢复日志功能的过程。
1万+

被折叠的 条评论
为什么被折叠?



