2009-11-10 77 views
19

我有一個嵌入式Linux系統,可以從USB卡自行更新。接口程序檢測USB插入並查找升級的可執行文件。我目前將其複製到本地文件並在rc5.d中安裝一些命令,以便在下次啓動時將文件複製到現有的exe文件中。然後我重新啓動軟件。替換在linux中運行的可執行文件

有沒有更好的方法來做到這一點?

+0

這個答案將幫助你理解如何做到這一點:http://stackoverflow.com/a/21115731/2706918 – 2014-01-14 14:27:58

回答

8

在linux中,您可以安全地替換進程運行時正在運行的可執行文件。只要進程正在運行,該實例將繼續使用「舊」代碼。所有對應用程序的新調用都將使用「新」代碼。因此,只需重新啓動應用程序(或者如果需要,設備)將使用新的副本。

請注意,如果您的應用程序將更改配置文件或庫,請注意,因爲這些可能不駐留在內存中。在這種情況下,更安全的選擇是讓腳本執行您提到的操作。

+1

關鍵要提到的是,你需要'解除()'原始文件第一(例如,使用'rm'命令)來保證這個保證。 – 2017-06-14 20:07:32

29

您不需要讓它在下次啓動時複製文件。相反,該序列將正常工作:

  • 將新的可執行文件複製到本地文件。
  • 驗證本地文件。
  • unlink()現有的可執行文件。
  • 將新的可執行文件重命名爲()正確的名稱。

應用程序將在unlink()之後繼續運行 - 在所有正在執行的副本完成之前,內核不會釋放基礎數據。

然後,您甚至可以使用execve()讓當前正在運行的進程用新上傳的版本替換它自己。

21

這是確定的程序運行而如果你rm取消鏈接)首先替換可執行它。

這不是cp發生的情況,所以不要使用它。要麼mv該文件,要麼確實,rm它,然後把新的一個放在同一個地方。如果你在嵌入式軟件中使用代碼,那麼unlink(2)就是你想要開始的。

Unix內核知道inode仍在使用中,他們將刪除文件的目錄條目,但它們不會釋放inode(和數據塊),直到inode引用計數爲零,並且贏得它的一個實例正在運行時不會發生。

這可能不是您的嵌入式系統的問題,但作爲一般的警告,不要指望這適用於網絡存儲,除非在服務器本身。

+0

我想我還應該補充說,如果網絡是在文件系統層下完成的,所以這項技術對於iSCSI來說可以。 – DigitalRoss 2009-11-11 00:19:17

相關問題