linux文件句柄,【LINUX】使用lsof處理文件恢復、句柄以及空間釋放問題

曾經在生產上遇到過一個df 和 du出現的結果不一致的問題,為了排查到底是哪個進程占用了文件句柄,導致空間未釋放,首先在linux上面,一切皆文件,這個問題可以使用lsof這個BT的命令來處理(這個哈還可以來查詢文件句柄泄露問題,應用程序的進程未關閉文件句柄)

1.文件句柄以及空間釋放問題

注:在生產環境常見的問題就是,有維護人員或者開發同事使用tail命令實時查看日志。然后另外的人使用rm命令刪除,這有就好導致磁盤空間不會真正的釋放,因為你要刪除的文件,還有進程在使用,文件句柄沒有釋放,即tail

模擬場景1:

你創建一個文件testfile

全選復制放進筆記

touch testfile

然后使用tail命令一直查看

全選復制放進筆記

tail testfile

這個時候另外一個同事使用rm命令來刪除了該文件

全選復制放進筆記

rm testfile

正式使用lsof命令排查

如果你知道文件名,那就可以直接使用如下命令

全選復制放進筆記

lsof |grep testfile

但是如果你不知道是哪個文件,或者是很多文件都有這樣的情況,那你需要使用如下命令

全選復制放進筆記

lsof |grep deleted 注:這個deleted表示該已經刪除了的文件,但是文件句柄未釋放,這個命令會把所有的未釋放文件句柄的進程列出來

注:有些系統你沒有配置環境變量的話,直接lsof是會報錯沒有該命令,你可以直接/usr/bin/lsof 或者是/usr/sbin/lsof,根據你的系統環境自己查看

然后上面命令出來的結果會出來如下結果

全選復制放進筆記

root 123 12244 0 14:47 pts/1 01:02:03 tail testfile

然后你可以使用kill 命令來釋放文件句柄從而釋放空間

全選復制放進筆記

kill 123

2. 文件恢復問題

在說明問題之前,先介紹下一些文件的基本概念:

文件實際上是一個指向inode的鏈接, inode鏈接包含了文件的所有屬性, 比如權限和所有者, 數據塊地址(文件存儲在磁盤的這些數據塊中). 當你刪除(rm)一個文件, 實際刪除了指向inode的鏈接, 并沒有刪除inode的內容. 進程可能還在使用. 只有當inode的所有鏈接完全移去, 然后這些數據塊將可以寫入新的數據.

proc文件系統可以協助我們恢復數據. 每一個系統上的進程在/proc都有一個目錄和自己的名字, 里面包含了一個fd(文件描述符)子目錄(進程需要打開文件的所有鏈接). 如果從文件系統中刪除一個文件, 此處還有一個inode的引用:

全選復制放進筆記

/proc/進程號/fd/文件描述符

你需要知道打開文件的進程號(pid)和文件描述符(fd). 這些都可以通過lsof工具方便獲得, lsof的意思是”list open files, 列出(進程)打開的文件”. 然后你將可以從/proc拷貝出需要恢復的數據.

1.創建一個測試文件并且備份下,方面后續驗證

全選復制放進筆記

touch testfile

cp testfile testfile.backup.2014

2.查看文件的相關信息

全選復制放進筆記

stat testfile

File: 'testfile' Size: 343545 Blocks: 241 IO Block: 4096 regular file

Device: fd00h/64768d Inode: 361579 Links: 1 Access: (0664/-rw-rw-r–) Uid: ( 505/ zhaoke) Gid: ( 505/ zhaoke)

Access: 2014-11-09 15:00:38.000000000 +0800 Modify: 2014-11-09 15:00:34.000000000 +0800 Change: 2014-04-09 15:00:34.000000000 +0800

沒問題, 繼續下面工作:

3.刪除文件

全選復制放進筆記

rm testfile

4.查看文件

全選復制放進筆記

ls -l testfile ls: testfile: No such file or directory

全選復制放進筆記

stat testfile stat: cannot stat 'testfile': No such file or directory

testfile文件刪除了,但不要終止仍在使用文件的進程, 因為一旦終止, 文件將很難恢復.

現在我們開始找回數據之旅,先使用lsof命令查看下

全選復制放進筆記

lsof | grep testfile

tail 5317 root 4r REG 253,0 343545 361579 /root/testfile (deleted)

第一個縱行是進程的名稱(命令名), 第二縱行是進程號(PID), 第四縱行是文件描述符

現在你知道5317進程仍有打開文件, 文件描述符是4. 那我們開始從/proc里面拷貝出數據.

你可能會考慮使用cp -a, 但實際上沒有作用, 你將拷貝的是一個指向被刪除文件的符號鏈接:

全選復制放進筆記

ls -l /proc/5317/fd/4 lr-x—— 1 root root 64 09 15:00 /proc/5317/fd/4 -> /root/testfile (deleted)

使用cp -a命令測試恢復

全選復制放進筆記

cp -a /proc/5317/fd/4 testfile.backup

使用ls命令來查看

全選復制放進筆記

ls -l testfile.backup

lrwxrwxrwx 1 root root 29 09 15:02 testfile.backup -> /roor/testfile (deleted)

通過上面的命令我們發現,使用cp -a命令,其恢復的是一個指向被刪除文件的符號鏈接

使用file命令分別查看文件和文件描述符

1.查看文件

全選復制放進筆記

file testfile.backup

testfile.backup: broken symbolic link to '/root/testfile (deleted)'

2.查看文件描述符

全選復制放進筆記

file /proc/5317/fd/4 /proc/5317/fd/4: broken symbolic link to '/root/myfile (deleted)'

根據上面的file結果,可以使用cp拷貝出文件描述符數據到一個文件中,如下:

全選復制放進筆記

cp /proc/5317/fd/4 testfile.new

使用上面的命令恢復后,我們需要最終確認一下文件是否恢復,以及文件內容是否正確:

全選復制放進筆記

ls -l testfile.new

然后把新舊的兩個文件對比

diff testfile.newmyfile.backup

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/277358.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/277358.shtml
英文地址,請注明出處:http://en.pswp.cn/news/277358.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

android天氣查詢(二)之網絡json數據的獲取

前面一篇文章介紹了如何使用ksoap獲取天氣信息,但是使用的網絡資源受到了限制,所以我們這里會采用第二種方法,可以無限制的獲取。http://m.weather.com.cn/data/101010100.html 但是對應的101010100(北京)我們怎么獲取呢,還有就是…

累.....

今天我真的蔫了,好累,腦子也好濁,但是還好,最終達到了預期的目的。我終于把henry的dataGrid實現了,犯了低級錯誤,和好多人討論,但最終還是henry解決的。那一刻,真的好爽,…

001-pro ant design 升級2.0后變更

一、更新點 1、目錄調整 2、本地代理服務器調整 roadhog→umi 配置方式 在這個config/config.js配置 "proxy": { "/api": { "target": "http://jsonplaceholder.typicode.com/", "changeOrigin": true, "pathRewrite&q…

linux cp 時 略過文件,CentOS下執行cp命令式提示略過文件夾

今天在CentOS下復制一個文件夾到另一個文件夾的時候cp ./res /usr 的時候出現了問題,提示我的是:cp略過了文件夾后來我找了一下在網上search了一下CP命令的用法:CP命令該命令的功能是將給出的文件或目錄拷貝到另一文件或目錄中,同…

屬性頁中的ON_UPDATE_COMMAND_UI

我前面翻譯了一篇文章簡單的談了一下在對話框處理ON_UPDATE_COMMAND_UI 消息。又在www.codeguru.com上看到在屬性頁中處理ON_UPDATE_COMMAND_UI 消息的方法和在對話框中稍有不同。兩者的處理大體上一樣。只是在屬性頁中還需要一個步驟。需要從CPropertySheet派生類,…

linux基礎命令rpm,rpm常用命令集合1

提要:RPM 是 Red Hat Package Manager 的縮寫,原意是Red Hat 軟件包管理;本文介紹RPM,并結合實例來解說RPM手工安裝、查詢等應用;正文:RPM包管理的用途;1、可以安裝、刪除、升級和管理軟件&…

hibernate詳解

Hibernate原理與應用 主要內容 1、引入 2、安裝配置 3、基本概念和CURD 4、HQL和Criteria 5、關聯映射 6、繼承映射 7、集合映射 8、懶加載 9、緩存 10、事務 11、其他 12、Hibernate不適合的場景 13、與JPA的集成(annotation方式) 14、最佳實踐 1、引入 模型不匹配(阻抗不匹配…

Csharp+Asp.net系列教程(四)

邁克老貓 來自:老貓的理想 本教程參考C#和ASP.NET程序設計教程撰寫,有什么不足之處請大家指出,或在老貓的理想BLOG留言。 這次簡述一下操作符 1.算術操作符 算術操作符包括加()、減(-)、乘(*)、除(/)和求余(%)。加減操作符…

linux 腳本 寫更新,用Shell寫的游戲客戶端更新腳本

#!/bin/sh########################################### 客戶端版本更新系統########################################### CLIENT_INIT_VERSION 客戶端新版本,默認是0# CLIENT_OLD_VERSION 客戶端舊版本(存放在VERSION_FILE指定的文件中),當沒有時取CL…

Android Studio 環境搭建參考,jdk10javac命令提示不是內部或外部命令

https://blog.csdn.net/qq_33658730/article/details/78547789 win10下Android Studio和SDK下載、安裝和環境變量配置 http://yanmin99.com/ android-0基礎從入門到精通 環境變量ANDROID_HOMEE:\Program Files (x86)\Android\SdkJAVA_HOMEE:\Program Files\Java\jdk1.8.0_161TO…

報表引擎 - 數據模型

介紹 本文檔是報表模型的數據模型部分,說明平臺報表中涉及的報表數據相關 術語 名稱 說明 數據源 數據源是與數據存儲的連接。支持數據源適配 數據集 定義報表數據來源的一個二維表 參數 報表往往有參數,例如,日報表,當…

linux 刪舊內核,Ubuntu 刪除舊內核的方法

使用Ubuntu時如果系統里安裝了很多內核,會造成多于的啟動列表。想刪掉一些不用的內核方法如下方法一:首先就是使用如下命令,列出所有安裝的內核,下表中,帶有p_w_picpath的就是內核文件。從中選擇要卸載的包&#xff0c…

L2-014 列車調度(隊列模擬:set)

題意: 兩端分別是一條入口(Entrance)軌道和一條出口(Exit)軌道,它們之間有N條平行的軌道。每趟列車從入口可以選擇任意一條軌道進入,最后從出口離開。在圖中有9趟列車,在入口處按照{…

新架設了一個CVS服務器 --by yp

cvs是個代碼管理的好東東,全稱并發版本控制。不知道的上網查一下資料。 我下載了相關的部分資料和軟件,包括架設服務器的軟件和使用服務的客戶端軟件,都是windows平臺下可用的, 其他平臺下的我都沒下載,因為不會用。在…

@hdu - 6372@ sacul

目錄 descriptionsolutionaccepted codedetailsdescription 定義矩陣 \(A_i\) 是一個大小為 \(p^i*p^i\) 的矩陣,其中 \(p\) 是第 \(c\) 個素數(c 給定),且 \(A_i[x][y] [C(x, y) \mod p > 0]\)(其中 C(x, y) 是組…

實驗室里人越來越少啊!

研二下半學期了。研三的師哥師姐們都忙著找工作,有的已經去工作了。只是偶而來實驗室轉轉。研一的師弟師妹,現在還都有課,實驗室也沒他們的機器,所以幾乎不來實驗室。我們研二的有四個人,兩個北京的。其中一個在外面打…

在一臺機器上搭建多個redis實例

默認Redis程序安裝在/usr/local/redis目錄下; 配置文件:/usr/local/redis/redis.conf,該配置文件中配置的端口為默認端口:6379; Redis的啟動命令路徑:/usr/local/bin/redis-server。 可以指定端口啟動多個R…

2年前 影子

1. 請問您知道 xxxx嗎 ? 麻煩了您? 2. 您在公司待了多長時間了? 3. 您覺得公司怎么樣? 。。。。。。 待續! 轉載于:https://www.cnblogs.com/nucdy/p/11151470.html

linux是只讀添加 來覆蓋,Linux之指令 重定向 文件覆蓋和文件追加

CXF支持 SOAP1.1 SOAP1.2協議SOAP協議分為兩個版本 1.1 1.2 默認支持1.1 實現方式: 1.編寫接口 import javax.jws.WebService; WebService public inte ...USACO Section 2.4: Bessie Come Home因為題目給了邊的信息,所以比較…

分層架構web容器的配置安全

轉自:http://hi.baidu.com/shineo__o/item/7520d54c24d234c71081da82 /ps:本以為這是一個偶然配置失誤造成的問題,但最近幾天無聊時測試發現,有此類似問題的站點就有上百個,所以在這里粗糙總結一下! 通常我們會碰到這樣…