Process
覆蓋執行檔會影響正在執行原始執行檔的程序嗎?
當一個執行檔在程序中執行時,如果該執行檔被覆蓋或刪除,然後通過重新安裝重新創建,該程序是否會重新執行新的執行檔?
問題的答案是否取決於
- 執行檔是否在程序中作為服務/守護程序執行?
- 作業系統,例如Linux,Unix,…?
- 重新安裝是來自安裝程序文件(例如
deb
Ubuntumsi
上的文件、Windows 上的文件)還是來自建構其原始碼?這裡有些例子:
- 在 Ubuntu 中,當一個程序執行一個執行檔時,當我通過手動重新安裝通過
configure
、make
和make install
在其原始碼上覆蓋該執行檔時,該程序仍然繼續執行原始執行檔,而不是新的執行檔。- 聽說在Windwos 10中,當一個程序將一個執行檔作為服務執行時,如果我們通過它的
msi
安裝程序文件重新安裝該執行檔,那麼該服務程序將重新啟動以執行新的執行檔。在 Ubuntu 或 Debian 上從 .deb 文件安裝是否相同或相似?謝謝。
這取決於核心和執行檔的類型。它不依賴於執行檔的啟動或安裝方式。
在 Linux 上:
- 對於本機執行檔(即包含機器程式碼的二進製文件,由核心直接執行),執行檔在執行時無法修改。
$ cp /bin/sleep . $ ./sleep 999999 & $ echo >sleep sh: 1: cannot create sleep: Text file busy
可以刪除執行檔(即取消連結)並在同一路徑創建一個新的。與文件仍處於打開狀態時被刪除的任何其他情況一樣,刪除執行檔不會影響正在執行的程序,並且在文件不再使用之前實際上不會將其從磁碟中刪除,即直到所有正在執行的實常式序退出。
- 對於腳本(以 開頭
#!
),可以在程序執行時修改腳本文件。這是否會影響程序取決於解釋器如何讀取腳本。如果它在開始執行之前將整個腳本讀入自己的記憶體,那麼執行將不會受到影響。如果解釋器按需讀取腳本,那麼執行可能會受到影響;這樣做的一些實現sh
。許多其他 Unix 系統都以這種方式執行,但不是全部。IIRC 舊版本的 Solaris 允許修改本機執行檔,這通常會導致它崩潰。一些 Unix 變體,包括 HP/UX,甚至不允許刪除目前正在執行的本機執行檔。
大多數軟體安裝程序都會在安裝新的執行檔之前刪除現有的執行檔,而不是覆蓋現有的二進製文件。例如做
rm /bin/target cp target /bin
而不僅僅是
cp target /bin
.install
shell 命令就是這樣做的。但這並不理想,因為如果有人/bin/target
在cp
程序執行時嘗試執行,他們會得到一個損壞的程序。最好將文件複製到一個臨時名稱,然後將其重命名為最終名稱。重命名文件(即將它移動到同一個目錄中,或者更一般地把它移動到同一個文件系統中)會刪除先前的目標文件(如果存在的話)。例如,這就是dpkg
工作原理。cp target /bin/target.tmp mv /bin/target.tmp /bin/target