如何查看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.pswp.cn/news/388106.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/388106.shtml
英文地址,請注明出處:http://en.pswp.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…