如何查看linux中文件打开情况

如何查看linux中文件打开情况

前言

我们都知道,在linux下,“一切皆文件”,因此有时候查看文件的打开情况,就显得格外重要,而这里有一个命令能够在这件事上很好的帮助我们-它就是lsof。

linux下有哪些文件

在介绍lsof命令之前,先简单说一下,linux主要有哪些文件:

  • 普通文件
  • 目录
  • 符号链接
  • 面向块的设备文件
  • 面向字符的设备文件
  • 管道和命名管道
  • 套接字

以上各类文件类型不多做详细介绍。

lsof命令实用用法介绍

lsof,是list open files的简称。它的参数很多,但是我们这里只介绍一些实用的用法(注意有些情况需要root权限执行)。

查看当前打开的所有文件

一般来说,直接输入lsof命令产生的结果实在是太多,可能很难找到我们需要的信息。不过借此说明一下一条记录都有哪些信息。

$ lsof(这里选取一条记录显示)
COMMAND   PID                      USER   FD             TYPE        DEVICE SIZE/OFF   NODE   NAME
vi        27940                    hyb    7u      REG               8,15     16384     137573 /home/hyb/.1.txt.swp

lsof显示的结果,从左往右分别代表:打开该文件的程序名,进程id,用户,文件描述符,文件类型,设备,大小,iNode号,文件名。

我们暂且先关注我们知道的列。这条记录,表明进程id为27940的vi程序,打开了文件描述值为7,且处于读写状态的,在/home/hyb目录下的普通文件(REG regular file).1.txt.swap,当前大小16384字节。

列出被删除但占用空间的文件

在生产环境中,我们可能会使用df命令看到磁盘空间占满了,然而实际上又很难找到占满空间的文件,这常常是由于某个大文件被删除了,但是它却被某个进程打开,导致通过普通的方式找不到它的踪迹,最常见的就是日志文件。我们可以通过lsof来发现这样的文件:

$ lsof |grep deleted
Xorg      1131 root  125u      REG                0,5        4      61026 /memfd:xshmfence (deleted)
Xorg      1131 root  126u      REG                0,5        4      62913 /memfd:xshmfence (deleted)
Xorg      1131 root  129u      REG                0,5        4      74609 /memfd:xshmfence (deleted)

可以看到这些被删除的但仍然被打开文件,最后查找出来的时候,会被标记deleted。这个时候就可以根据实际情况分析,到底哪些文件可能过大但是却被删除了,导致空间仍然占满。

恢复打开但被删除的文件

前面我们可以找到被删除但是仍然被打开的文件,实际上文件并没有真正的消失,如果是意外被删除的,我们还有手段恢复它。以/var/log/syslog文件为例,我们先删除它(root用户):

$ rm /var/log/syslog

然后使用lsof查看那个进程打开了该文件:

$ lsof |grep syslog
rs:main    993 1119           syslog    5w      REG               8,10     78419     528470 /var/log/syslog (deleted)

可以找到进程id为993的进程打开了该文件,我们知道每个进程在/proc下都有文件描述符打开的记录:

$ ls -l /proc/993/fd
lr-x------ 1 root   root   64 3月   5 18:30 0 -> /dev/null
l-wx------ 1 root   root   64 3月   5 18:30 1 -> /dev/null
l-wx------ 1 root   root   64 3月   5 18:30 2 -> /dev/null
lrwx------ 1 root   root   64 3月   5 18:30 3 -> socket:[15032]
lr-x------ 1 root   root   64 3月   5 18:30 4 -> /proc/kmsg
l-wx------ 1 root   root   64 3月   5 18:30 5 -> /var/log/syslog (deleted)
l-wx------ 1 root   root   64 3月   5 18:30 6 -> /var/log/auth.log

这里就找到了被删除的syslog文件,文件描述符是5,我们把它重定向出来:

$ cat /proc/993/fd/5 > syslog
$ ls -al /var/log/syslog
-rw-r--r-- 1 root root 78493 3月   5 19:22 /var/log/syslog

这样我们就恢复了syslog文件。

查看当前文件被哪些进程打开

Windows下经常遇到要删除某个文件,然后告诉你某个程序正在使用,然而不告诉你具体是哪个程序。我们可以在资源管理器-性能-资源监视器-cpu-关联的句柄处搜索文件,即可找到打开该文件的程序,但是搜索速度感人。

linux就比较容易了,使用lsof命令就可以了,例如要查看当前哪些程序打开了hello.c:

$ lsof hello.c
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
tail    28731  hyb    3r   REG   8,15      228 138441 hello.c

但是我们会发现,使用vi打开的hello.c并没有找出来,这是因为vi打开的是一个临时副本。我们换一种方式查找:

$ lsof |grep hello.c
tail      28906                    hyb    3r      REG               8,15       228     138441 /home/hyb/workspaces/c/hello.c
vi        28933                    hyb    9u      REG               8,15     12288     137573 /home/hyb/workspaces/c/.hello.c.swp

这样我们就找到了两个程序和hello.c文件相关。

这里grep的作用是从所有结果中只列出符合条件的结果。

查看某个目录文件被打开情况

$ lsof +D ./

查看当前进程打开了哪些文件

使用方法:lsof -c 进程名
通常用于程序定位问题,例如用于查看当前进程使用了哪些库,打开了哪些文件等等。假设有一个循环打印字符的hello程序:

$ lsof -c hello
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
hello   29190  hyb  cwd    DIR   8,15     4096 134538 /home/hyb/workspaces/c
hello   29190  hyb  rtd    DIR   8,10     4096      2 /
hello   29190  hyb  txt    REG   8,15     9816 138314 /home/hyb/workspaces/c/hello
hello   29190  hyb  mem    REG   8,10  1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hello   29190  hyb  mem    REG   8,10   162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hello   29190  hyb    0u   CHR 136,20      0t0     23 /dev/pts/20
hello   29190  hyb    1u   CHR 136,20      0t0     23 /dev/pts/20
hello   29190  hyb    2u   CHR 136,20      0t0     23 /dev/pts/20

我们可以从中看到,至少它用到了/lib/x86_64-linux-gnu/libc-2.23.so以及hello文件。

也可以通过进程id查看,可跟多个进程id,使用逗号隔开:

$ lsof -p 29190
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
hello   29190  hyb  cwd    DIR   8,15     4096 134538 /home/hyb/workspaces/c
hello   29190  hyb  rtd    DIR   8,10     4096      2 /
hello   29190  hyb  txt    REG   8,15     9816 138314 /home/hyb/workspaces/c/hello
hello   29190  hyb  mem    REG   8,10  1868984 939763 /lib/x86_64-linux-gnu/libc-2.23.so
hello   29190  hyb  mem    REG   8,10   162632 926913 /lib/x86_64-linux-gnu/ld-2.23.so
hello   29190  hyb    0u   CHR 136,20      0t0     23 /dev/pts/20
hello   29190  hyb    1u   CHR 136,20      0t0     23 /dev/pts/20
hello   29190  hyb    2u   CHR 136,20      0t0     23 /dev/pts/20

当然这里还有一种方式,就是利用proc文件系统,首先找到hello进程的进程id
:

$ ps -ef|grep hello
hyb      29190 27929  0 21:14 pts/20   00:00:00 ./hello 2
hyb      29296 28848  0 21:18 pts/22   00:00:00 grep --color=auto hello

可以看到进程id为29190,查看该进程文件描述记录目录:

$ ls -l /proc/29190/fd
lrwx------ 1 hyb hyb 64 3月   2 21:14 0 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月   2 21:14 1 -> /dev/pts/20
lrwx------ 1 hyb hyb 64 3月   2 21:14 2 -> /dev/pts/20

这种方式能够过滤很多信息,因为它只列出了该进程实际打开的,这里它只打开了1,2,3,即标准输入,标准输出和标准错误。

查看某个端口被占用情况

在使用数据库或者启用web服务的时候,总能遇到端口占用问题,那么怎么查看某个端口是否被占用呢?

$ lsof -i :6379
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
redis-ser 29389  hyb    6u  IPv6 534612      0t0  TCP *:6379 (LISTEN)
redis-ser 29389  hyb    7u  IPv4 534613      0t0  TCP *:6379 (LISTEN)

这里可以看到redis-ser进程占用了6379端口。

查看所有的TCP/UDP连接

$ lsof -i tcp
ava       2534  hyb    6u  IPv6  31275      0t0  TCP localhost:9614 (LISTEN)
java       2534  hyb   22u  IPv6  96922      0t0  TCP localhost:9614->localhost:39004 (ESTABLISHED)
java       2534  hyb   23u  IPv6 249588      0t0  TCP localhost:9614->localhost:45460 (ESTABLISHED)

当然我们也可以使用netstat命令。

$ netstat -anp|grep 6379

这里的-i参数可以跟多种条件:

  • -i 4    #ipv4地址
  • -i 6    #ipv6地址
  • -i tcp  #tcp连接
  • -i :3306  #端口
  • -i @ip  #ip地址

因此需要查看与某个ip地址建立的连接时,可以使用下面的方式:

$ lsof -i@127.0.0.1

查看某个用户打开了哪些文件

linux是一个多用户操作系统,怎么知道其他普通用户打开了哪些文件呢?可使用-u参数

$ lsof -u hyb
(内容太多,省略)

列出除了某个进程或某个用户打开的文件

实际上和前面使用方法类似,只不过,在进程id前面或者用户名前面加^,例如:

lsof -p ^1     #列出除进程id为1的进程以外打开的文件
lsof -u ^root  #列出除root用户以外打开的文件

总结

 

最新内容地址:https://www.yanbinghu.com/2019/03/05/61180.html

 

以上介绍基于一个条件,实际上多个条件可以组合,例如列出进程id为1的进程打开的tcp套接字文件:

lsof -p 1 -i tcp

lsof参数很多,具体的可以使用man命令查看,但是对于我们来说,知道这些实用的基本足够。

原文地址https://www.cnblogs.com/bianchengzhuji/p/10485991.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388106.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hadoop windows

1、安装JDK1.6或更高版本 官网下载JDK,安装时注意,最好不要安装到带有空格的路径名下,例如:Programe Files,否则在配置Hadoop的配置文件时会找不到JDK(按相关说法,配置文件中的路径加引号即可解决&#xff…

Ocelot中文文档入门

入门 Ocelot仅适用于.NET Core,目前是根据netstandard2.0构建的,如果Ocelot适合您,这个文档可能会有用。 .NET Core 2.1 安装NuGet包 使用nuget安装Ocelot及其依赖项。 您需要创建一个netstandard2.0项目并将其打包到其中。 然后按照下面的“…

科学价值 社交关系 大数据_服务的价值:数据科学和用户体验研究美好生活

科学价值 社交关系 大数据A crucial part of building a product is understanding exactly how it provides your customers with value. Understanding this is understanding how you fit into the lives of your customers, and should be central to how you build on wha…

在Ubuntu下创建hadoop组和hadoop用户

一、在Ubuntu下创建hadoop组和hadoop用户 增加hadoop用户组,同时在该组里增加hadoop用户,后续在涉及到hadoop操作时,我们使用该用户。 1、创建hadoop用户组 2、创建hadoop用户 sudo adduser -ingroup hadoop hadoop 回车后会提示输入新的UNIX…

day06 hashlib模块

1.hashlib模块 import hashlib# password123456# print( password.encode()) #加密前先转成二进制# mhashlib.md5(password.encode())# print(dir(m)) #查询m的所有方法## print(m.hexdigest()) #使用hexdigest()方法加密,md5加密之后是不可逆,不可以解…

vs azure web_在Azure中迁移和自动化Chrome Web爬网程序的指南。

vs azure webWebscraping as a required skill for many data-science related jobs is becoming increasingly desirable as more companies slowly migrate their processes to the cloud.随着越来越多的公司将其流程缓慢迁移到云中,将Web爬网作为许多与数据科学相…

hadoop eclipse windows

首先说一下本人的环境: Windows7 64位系统 Spring Tool Suite Version: 3.4.0.RELEASE Hadoop2.6.0 一.简介 Hadoop2.x之后没有Eclipse插件工具,我们就不能在Eclipse上调试代码,我们要把写好的java代码的MapReduce打包成jar然后在Linux上运…

同步函数死锁现象

多线程:一个进程中有多个线程可以同时执行任务 多线程的好处: 1、解决一个进程中可以同时执行多个任务的问题。 2、提高了资源利用率 多线程的弊端: 1、增加了CPU的负担 2、降低了一个进程中线程的执行概率 3、出现了线程安全问题 4、会引发死…

netstat 在windows下和Linux下查看网络连接和端口占用

假设忽然起个服务,告诉我8080端口被占用了,OK,我要去看一下是什么服务正在占用着,能不能杀 先假设我是在Windows下: 第一列: Proto 协议 第二列: 本地地址【ip端口】 第三列:远程地址…

selenium 解析网页_用Selenium进行网页搜刮

selenium 解析网页网页抓取系列 (WEB SCRAPING SERIES) 总览 (Overview) Selenium is a portable framework for testing web applications. It is open-source software released under the Apache License 2.0 that runs on Windows, Linux and macOS. Despite serving its m…

表的设计与优化

单表设计与优化 1)设计规范化表,消除数据冗余(以使用正确字段类型最明显): 数据库范式是确保数据库结构合理,满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表,称为规范…

代理ARP协议(Proxy ARP)

代理ARP(Proxy-arp)的原理就是当出现跨网段的ARP请求时,路由器将自己的MAC返回给发送ARP广播请求发送者,实现MAC地址代理(善意的欺骗),最终使得主机能够通信。 图中R1和R3处于不同的局域网&…

hive 导入hdfs数据_将数据加载或导入运行在基于HDFS的数据湖之上的Hive表中的另一种方法。

hive 导入hdfs数据Preceding pen down the article, might want to stretch out appreciation to all the wellbeing teams beginning from cleaning/sterile group to Nurses, Doctors and other who are consistently battling to spare the mankind from continuous Covid-1…

Java性能优化

一、避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快。 例子: import java.util.vector; class …

对Faster R-CNN的理解(1)

目标检测是一种基于目标几何和统计特征的图像分割,最新的进展一般是通过R-CNN(基于区域的卷积神经网络)来实现的,其中最重要的方法之一是Faster R-CNN。 1. 总体结构 Faster R-CNN的基本结构如下图所示,其基础是深度全…

大数据业务学习笔记_学习业务成为一名出色的数据科学家

大数据业务学习笔记意见 (Opinion) A lot of aspiring Data Scientists think what they need to become a Data Scientist is :许多有抱负的数据科学家认为,成为一名数据科学家需要具备以下条件: Coding 编码 Statistic 统计 Math 数学 Machine Learni…

postman 请求参数为数组及JsonObject

2019独角兽企业重金招聘Python工程师标准>>> 1. (1)数组的请求方式(post) https://blog.csdn.net/qq_21205435/article/details/81909184 (2)数组的请求方式(get) http://localhost:port/list?ages10,20,30 后端接收方式: PostMa…

领扣(LeetCode)对称二叉树 个人题解

给定一个二叉树,检查它是否是镜像对称的。 例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ \2 2/ \ / \ 3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ \2 2\ \3 3说明: 如果你可以运用递归和迭代两种方法解决这个问题&#…

python 开发api_使用FastAPI和Python快速开发高性能API

python 开发apiIf you have read some of my previous Python articles, you know I’m a Flask fan. It is my go-to for building APIs in Python. However, recently I started to hear a lot about a new API framework for Python called FastAPI. After building some AP…

Purley平台Linpak测试,从踏坑开始一步步优化

Purley平台Linpak测试,从踏坑开始一步步优化 #记2017年11月第一次踏坑事件 测试平台配置: 6nodes CPU: Intel Gold 6132 2.6GHz 14C RAM: 8G *12 2666MHz NET: Infiband FDR OS: centos7.2 mpi: Intel-mpi hpl: xhpl.intel 开始踏第一坑 现象&#xff1a…