我有一個嵌入式Linux系統,可以從USB卡自行更新。接口程序檢測USB插入並查找升級的可執行文件。我目前將其複製到本地文件並在rc5.d中安裝一些命令,以便在下次啓動時將文件複製到現有的exe文件中。然後我重新啓動軟件。替換在linux中運行的可執行文件
有沒有更好的方法來做到這一點?
我有一個嵌入式Linux系統,可以從USB卡自行更新。接口程序檢測USB插入並查找升級的可執行文件。我目前將其複製到本地文件並在rc5.d中安裝一些命令,以便在下次啓動時將文件複製到現有的exe文件中。然後我重新啓動軟件。替換在linux中運行的可執行文件
有沒有更好的方法來做到這一點?
在linux中,您可以安全地替換進程運行時正在運行的可執行文件。只要進程正在運行,該實例將繼續使用「舊」代碼。所有對應用程序的新調用都將使用「新」代碼。因此,只需重新啓動應用程序(或者如果需要,設備)將使用新的副本。
請注意,如果您的應用程序將更改配置文件或庫,請注意,因爲這些可能不駐留在內存中。在這種情況下,更安全的選擇是讓腳本執行您提到的操作。
關鍵要提到的是,你需要'解除()'原始文件第一(例如,使用'rm'命令)來保證這個保證。 – 2017-06-14 20:07:32
您不需要讓它在下次啓動時複製文件。相反,該序列將正常工作:
應用程序將在unlink()
之後繼續運行 - 在所有正在執行的副本完成之前,內核不會釋放基礎數據。
然後,您甚至可以使用execve()
讓當前正在運行的進程用新上傳的版本替換它自己。
這是確定的程序運行而如果你rm
(取消鏈接)首先替換可執行它。
這不是cp
發生的情況,所以不要使用它。要麼mv
該文件,要麼確實,rm
它,然後把新的一個放在同一個地方。如果你在嵌入式軟件中使用代碼,那麼unlink(2)
就是你想要開始的。
Unix內核知道inode仍在使用中,他們將刪除文件的目錄條目,但它們不會釋放inode(和數據塊),直到inode引用計數爲零,並且贏得它的一個實例正在運行時不會發生。
這可能不是您的嵌入式系統的問題,但作爲一般的警告,不要指望這適用於網絡存儲,除非在服務器本身。
我想我還應該補充說,如果網絡是在文件系統層下完成的,所以這項技術對於iSCSI來說可以。 – DigitalRoss 2009-11-11 00:19:17
這個答案將幫助你理解如何做到這一點:http://stackoverflow.com/a/21115731/2706918 – 2014-01-14 14:27:58