标签:linux 系统监控诊断工具 lsof 命令 lsof详解
lsof命令
lsof(list open files)是一个列出当前系统打开文件的工具。系统在后台为应用程序分配了独立的文件
描述符,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口,描述符提供了大量关于
这个应用程序本身的信息,通过lsof命令能够查看这个列表,常常用于对系统监测诊断排错
[root@localhost~]# lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
init 1 root cwd DIR 6,1 5069 2 /
init 1 root rtd DIR 6,1 5069 2 /
init 1 root txt REG 6,1 1235602 54127 /sbin/init
udevd 235 root 0u CHR 1,5 0t0 6862 /dev/null
udevd 235 root 1u CHR 1,5 0t0 6862 /dev/null
udevd 235 root 2u CHR 1,5 0t0 6862 /dev/null
COMMAND:进程的名称
PID:进程标识符
USER:进程所有者
FD:文件描述符,应用程序通过文件描述符识别该文件
TYPE:文件类型,如DIR、REG等
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称
常用参数
常用的参数列表:
lsof filename 显示打开指定文件的所有进程
lsof -a 表示多条件查询都满足时才显示结果
lsof -c string 显示COMMAND列中包含指定字符的进程所有打开的文件
lsof -u username 显示所属user进程打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /DIR/ 显示目录下被进程打开的文件
lsof -d FD 显示指定文件描述符的进程
lsof -n 不将IP转换为hostname,缺省是不加上-n参数
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4地址
service --> /etc/service中的 service name (可以多个)
port --> 端口号 (可以多个)
应用实例
lsof `which httpd` 那个进程在使用httpd的可执行文件
lsof /etc/passwd 那个进程在占用/etc/passwd
lsof /dev/sdb2 那个进程在占用sdb2
lsof /dev/cdrom 那个进程在占用光驱
lsof -c sendmail 查看sendmail进程的文件使用情况
lsof -c courier -u ^root 显示出那些文件被以courier打头的进程打开,但是并不属于用户root
lsof -p 30297 显示那些文件被pid为30297的进程打开
lsof -utom 查看用户tom的进程的文件使用情况
lsof -i 显示所有打开的端口
lsof -i:80 显示所有打开80端口的进程
用lsof查找恢复被误删的文件
当某个文件被意外地删除了,只要系统中还有进程正在访问该文件,就可以通过lsof从/proc目录下恢复该文件的内容
假如将/var/logs/messages文件误删了,文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logs/messages文件
[root@localhost~]# lsof |grep /var/logs/messages
syslogd 1693 root 3w REG 3,3 5896712 1283685 /var/logs/messages (deleted)
从上面的信息可以看到 PID 1693(syslogd)打开文件的文件描述符为3,找到/var/logs/messages已经
标记被删除了。因此我们可以在 /proc/1693/fd/3 (fd下的每个以数字命名的文件表示进程对应的文件
描述符)中查看相应的信息
[root@localhost~]# head -n 10 /proc/1693/fd/3
Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
......
用命令恢复数据 cat /proc/1693/fd/3 > /var/logs/messages
删除数据后,磁盘空间未释放问题
当要删除一个文件,执行rm -rf /var/logs/messages 后,磁盘空间未释放
首先查看文件进程是否还存在
[root@localhost~]# lsof |grep /var/logs/messages
syslogd 1693 root 3w REG 3,3 5896712 1283685 /var/logs/messages (deleted)
从上面的信息可以看到 PID 1693(syslogd)打开文件的文件描述符为3,/var/logs/messages已经标记被删除了,但在/proc/1693/fd/3 中查看所有信息依旧存在
可以使用命令清空这个文件
echo "" > /proc/1693/fd/3 或者 rm -rf /proc/1693/fd/3
清空后,磁盘空间立刻释放
本文出自 “实用Linux知识技能分享” 博客,请务必保留此出处http://superleedo.blog.51cto.com/12164670/1887687
标签:linux 系统监控诊断工具 lsof 命令 lsof详解
原文地址:http://superleedo.blog.51cto.com/12164670/1887687