本來今天不準備開電腦了,太困了,想睡覺,然而一哥們兒短信都發過來了,要問個問題,于是還是打開了電腦,沒想到是一個很有代表性的問題,順便也牽扯了前些天我的工作中的一個bug,值得記錄下來。問題如下:
linux下,一個可執行文件exe1正在執行中,rm –f可以將其刪除,mv可以將其移除,mv $other exe1也可以將其替換,但是cp $other exe1則顯示文件忙,求解。
這實際上并不是一個真正的問題,因為只要你的基礎知識扎實,這個問題顯然很簡單,原因只有一個,那就是linux文件基于引用計數。現在問題是這些個命令如何來操作一個文件的引用計數。下面的討論都是基于獨占打開的模式。
如果一個文件已經被打開,那么它的引用計數會增加1,如果調用了rm,實際上底層只是unlink了一下,也就是說將它的引用計數減少1,這樣雖然你在界面上(命令行或者GUI)看不到它了,但是它被打開時的計數還在,只有當它被關閉的時候,引用計數變為0,才徹底刪除它。
再說mv命令,它實際上只是一個源文件的rename而已,如果mv的目標本來就存在,那么在目標上執行一個類似rm的效果,也就是unlink一下,結合引用計數的理論,目標文件如果已經被打開,那么當關閉的時候將不復存在,如果本來就沒有被打開,那么mv的時候,目標直接被刪除,因為unlink之后,它的引用計數變成了0。
最后看一下cp命令,cp的話并不觸動源文件和目標文件元數據本身(時間戳除外),它只是打開源文件和目標文件,在源文件上執行read,然后將結果write到目標文件,實質上是一個IO操作,對于可執行文件,是獨占打開的,并不允許寫入,因此會出錯。
這里就不再列出內核源碼了,可以自行參考系統調用的實現而加深理解,不過最好別干巴巴的看,還是結合strace以及objdump比較好,要知道是怎么以及什么時候調用的,以及調用參數是什么,否則就和八股文沒區別了。那么這和我工作中的bug有什么關系呢?這個bug源于OpenVPN的日志記錄,并且配置了日志回滾,回滾配置文件關鍵字段如下:
size 4M
missingok
rotate 9
compress
delaycompress
create 644 xx xx
…
結果當日志回滾成了vpn.log.1之后,這個vpn.log.1依然繼續被寫入。這個原因正是rename造成的。在logrotate的man頁面中,有一個copytruncate配置,其含義就是不進行rename,而只是copy,然后將原來的文件truncate,加入這個就可以了。
千萬不要小看這些很簡單的命令,真正理解的人并不多,即使真正的理解,出現問題,能真正對應到原理也不多,很簡單的東西如果能徹底做到透徹的理解并且活用,再往深入學習才是有意義的。
Linux中文件執行中的鎖定怪現象解釋
2019-12-02 16:56Linux教程網 Linux
linux下,一個可執行文件exe1正在執行中,rm –f可以將其刪除,mv可以將其移除,mv $other exe1也可以將其替換,但是cp $other exe1則顯示文件忙,求解
延伸 · 閱讀
- 2024-11-03晨報:《龍騰4》Steam“多半好評” 《Apex》不再支
- 2022-03-11在Linux下通過命令行打包Android應用的方法
- 2022-03-10這個 Linux 圖形計算器讓數學很有趣
- 2022-03-10Linux下部署springboot項目的方法步驟
- 2022-03-10linux中把.c的文件編譯成.so文件
- 2022-03-10Linux服務器下安裝配置Nginx的教程
- Linux
linux下時間同步的兩種方法分享
在需要集中記錄服務器日志的環境中,時間同步那是相當的重要的。本文為大家介紹兩種同步linux時間的方法,供大家參考 ...
- Linux
Linux命令學習總結:詳解reboot命令
這篇文章主要介紹了Linux命令學習總結:詳解reboot命令,這個指令使用起來非常簡單,有興趣的可以了解一下。...
- Linux
linux下gettimeofday函數windows替換方法(詳解)
下面小編就為大家帶來一篇linux下gettimeofday函數windows替換方法(詳解)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看...
- Linux
在Linux系統上安裝配置DNS服務器的教程
這篇文章主要介紹了在Linux上安裝配置DNS服務器的教程,文中示例基于CentOS系統,需要的朋友可以參考下...
- Linux
Linux 將支持基于 Li-Fi 的新型網絡技術
據 phoronix 報道,Li-Fi 技術供應商 PureLiFi 近來正在向 Linux 內核社區積極貢獻代碼,以推動將其開源的 Li-Fi 驅動程序并入 Linux 內核主線。...
- Linux
Linux下查看使用的是哪種shell的方法匯總
這篇文章主要介紹了Linux下查看使用的是哪種shell的方法匯總,本文總結了9種查看當前系統使用的是哪種shell的方法,需要的朋友可以參考下 ...
- Linux
Linux基礎:如何找出你的系統所支持的最大內存
這篇文章主要介紹了Linux基礎:如何找出你的系統所支持的最大內存,需要的朋友可以參考下...
- Linux
致命的7個Linux命令
如果你是一個 Linux 新手,在好奇心的驅使下,可能會去嘗試從各個渠道獲得的命令。以下是 7 個致命的 Linux 命令,輕則使你的數據造成丟失,重則使你的...