Process

覆蓋執行檔會影響正在執行原始執行檔的程序嗎?

  • March 25, 2017

當一個執行檔在程序中執行時,如果該執行檔被覆蓋或刪除,然後通過重新安裝重新創建,該程序是否會重新執行新的執行檔?

問題的答案是否取決於

  • 執行檔是否在程序中作為服務/守護程序執行?
  • 作業系統,例如Linux,Unix,…?
  • 重新安裝是來自安裝程序文件(例如debUbuntumsi上的文件、Windows 上的文件)還是來自建構其原始碼?

這裡有些例子:

  • 在 Ubuntu 中,當一個程序執行一個執行檔時,當我通過手動重新安裝通過configuremakemake 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. installshell 命令就是這樣做的。但這並不理想,因為如果有人/bin/targetcp程序執行時嘗試執行,他們會得到一個損壞的程序。最好將文件複製到一個臨時名稱,然後將其重命名為最終名稱。重命名文件(即將它移動到同一個目錄中,或者更一般地把它移動到同一個文件系統中)會刪除先前的目標文件(如果存在的話)。例如,這就是dpkg工作原理。

cp target /bin/target.tmp
mv /bin/target.tmp /bin/target

引用自:https://unix.stackexchange.com/questions/353457