【问题标题】:replace a process bin file when it is running运行时替换进程bin文件
【发布时间】:2025-12-11 15:50:01
【问题描述】:

我有一个正在运行的服务器程序(由 g++ 编译)。我更改了一些代码并编译了一个新的 bin 文件。在不杀死正在运行的进程的情况下,我 mv 新创建的 bin 以覆盖旧的。

过了一会儿,服务器进程崩溃了。它与我的替换操作有关吗?

我的服务器是多线程高并发服务器。一个崩溃是段错误,另一个是死锁。 我打印核心转储文件中的所有参数,并将它们传递给崩溃的函数。不过没关系。

而且我仔细观察了死锁核心转储中的所有线程信息,我找不到导致死锁的可能性。

所以我怀疑替换会引起奇怪的事情

根据这个question,如果发生swap动作,确实会产生奇怪的东西

【问题讨论】:

  • 你能给我们更多的信息吗?您能否提供两组示例代码,以展示将一组替换为另一组时的行为?什么是崩溃? (分段错误?)诅咒转储/调试器说什么?
  • 我目前无法对技术细节发表评论,但我已经看到您在替换库或二进制文件时对自己的描述。

标签: linux


【解决方案1】:

对于一个简单的标准程序,即使它当前被正在运行的进程打开,移动一个新文件将首先取消原始文件的链接,除此之外将保持不变。

但是对于长时间运行的服务器,可能会发生很多事情:一些 fork 新进程,有时甚至可以执行一个新的新版本。在这种情况下,您可以同时运行不同的版本,这取决于更改是否受支持。

换一种说法,如果没有更多关于什么是服务器程序、它的设计运行方式以及发生了什么变化的更多信息,我能给出的唯一答案是也许

【讨论】:

    【解决方案2】:

    如果您可以确保仅删除 bin 文件,并且 bin 文件不被任何其他进程(例如某些守护程序)使用。那么它与您的替换操作无关。

    【讨论】:

    • 删除?更换呢? ... 你确定吗?我会说“是的 - 它很可能与替换有关”......
    • @Attie 如果可执行文件正在运行,您可以从硬盘驱动器中删除、替换或执行任何其他操作。因为它已被加载到 RAM 中。 OP说,他用新的替换了旧的bin文件,但没有执行新的。
    • 当然 - 但是如果应用程序被换出会发生什么......它是进入交换状态,还是“在磁盘上”,所以简单地丢弃了?然后,当尝试将其“交换”回时,文件已更改,因此应用程序崩溃。
    • @Attie 我曾考虑过这种可能性。我的服务器是 206 MB。但是机器内存是8G。所以似乎没有必要交换垃圾箱。但是没有办法确定
    • @Yves 我没有删除它。我只是将新的 mv 放入旧的文件夹中。