替换linux中正在运行的可执行文件

时间:2009-11-10 23:38:32

标签: linux

我有一个嵌入式Linux系统,可以从USB卡更新自己。接口程序检测USB插入并查找升级的可执行文件。我目前将其复制到本地文件并在rc5.d中安装一些命令,以便在下次启动时将文件复制到现有的exe文件中。然后我重启软件。

有更好的方法吗?

3 个答案:

答案 0 :(得分:31)

下次启动时,您无需将文件复制过来。相反,这个序列将正常工作:

  • 将新的可执行文件复制到本地文件。
  • 验证本地文件。
  • unlink()现有的可执行文件。
  • 将新的可执行文件重命名为正确的名称。

应用程序将在unlink()之后继续运行 - 内核将不会释放基础数据,直到完成所有正在执行的副本。

然后,您甚至可以使用execve()让当前正在运行的流程将其替换为新上传的版本。

答案 1 :(得分:24)

在程序运行 IF 你{{1>}(取消链接)时,可以替换可执行文件。

rm不会发生这种情况,所以不要使用它。 cp文件,或者,确实mv它,然后将新文件放在同一个地方。如果您使用嵌入式软件中的代码执行此操作,那么rm就是您想要的开始。

Unix内核知道inode仍然在使用,他们将删除该文件的目录条目,但是他们不会释放inode(和数据块),直到inode引用计数达到零,并且赢得了'当它的一个实例正在运行时发生。

这可能不是您的嵌入式系统的问题,但作为一般注意事项,不要指望这适用于网络存储,除非在服务器本身上。

答案 2 :(得分:10)

在linux中,您可以在进程运行时安全地替换正在运行的可执行文件。只要进程正在运行,该实例将继续使用“旧”代码。对应用程序的所有新调用都将使用“新”代码。因此,只需重新启动应用程序(或必要时设备)即可使用新副本。

请注意,如果您的应用程序将更改配置文件或库,则必须小心,因为这些文件或库可能不会驻留在内存中。在这种情况下,更安全的赌注是让脚本执行您提到的操作。