為什麼軟體包升級後仍能正常運作?

為什麼軟體包升級後仍能正常運作?

假設我正在運行一個軟體,然後我運行套件管理器來升級該軟體,我注意到 Linux 並沒有停止套件升級的運行進程 - 它仍然運行良好。 Linux 是如何做到這一點的呢?

答案1

原因是 Unix 在執行時不會鎖定可執行文件,或者即使它像 Linux 一樣,該鎖定也適用於 inode,而不是文件名。這意味著即使檔案已被刪除(實際上未連結)並被同名的新檔案替換,保持開啟狀態的進程也會存取相同的(舊)數據,這本質上是套件更新的作用。

這是 Unix 和 Windows 之間的主要區別之一。後者無法更新鎖定的文件,因為它缺少文件名和索引節點之間的一層,這使得更新甚至安裝某些軟體包變得很麻煩,因為它通常需要完全重新啟動。

答案2

可執行檔通常會開啟一次,附加到檔案描述符,並且在單一執行期間重新開啟的二進位檔案沒有檔案描述符。例如,如果您執行bash,通常只會在呼叫時為一次exec()指向的 inode 建立一個檔案描述符。/bin/bash

這通常意味著,對於在執行期間不嘗試重新讀取自身的簡單二進位檔案(透過使用呼叫它們的路徑),快取的內容會作為懸空 inode 保持有效。這意味著本質上存在可執行檔的先前版本的副本。

在更複雜的情況下,這可能會導致問題。例如,設定檔可能會升級並隨後重新讀取,或者程式可能會透過其執行路徑重新執行自身。如果程式互連,且一個在升級之前執行,另一個在升級之後執行(可能由第一個程式執行),也可能會出現問題。對於某些圖書館也是如此。

不過,對於簡單的用例,無需重新啟動進程即可安全升級。

相關內容