了解一下lsof

本文介绍了Linux系统中lsof命令的使用,包括查看打开文件的进程、文件描述符以及如何恢复已删除但仍在使用的文件。通过实例展示了当/var/log/messages被删除时,如何找到并恢复该文件。此外,还提到了系统日志丢失的可能原因,即相关日志服务未启动,并演示了启动服务恢复日志功能的过程。
摘要由CSDN通过智能技术生成

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 ~]# 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值