2

我有一个作为 linux 服务运行的 C++ 程序。某些程序的命令行选项只是在其配置文件中设置值然后退出,然后需要重新启动服务以获取新配置。为了让服务继续不间断地运行,它的工作原理如下:

  • 后台服务在系统启动时启动
    • 后台服务创建一个“配置看门狗”线程监控配置文件
  • 用户从命令行运行“progname 选项”
    • 配置文件修改
    • 程序退出的命令行实例
    • 后台服务配置看门狗线程检测到配置更改,触发重启

当程序在读取新配置后重新启动时,我正在调用 execv 以便它将与原始实例保持在同一进程空间中,以便它可以继续作为服务进行管理。问题是 execv 没有按预期运行,而是终止现有进程并在新进程中重新启动。因为 PID 不再匹配,如果我在此之后尝试运行“service progname stop/restart”,它将无法正常工作,“stop”将使服务继续运行,“restart”将产生程序的重复实例.

我已经确认传递给 execv 的 argv[0] 是可执行文件的完整路径,因此它不应该通过 shell 在 PATH 中搜索可执行文件(这也应该被我使用 execv 的事实所阻止而不是 execvp) 我读过的关于在其他应用程序中引起类似问题的文章。

4

1 回答 1

0

发现了问题,问题是程序在启动时使用了 daemon(),它在内部执行了 fork/exec,并且在重新启动程序时再次调用了 daemon()。在增强它以区分启动/重启并避免再次调用 daemon() 后,问题得到修复。

于 2012-12-18T22:20:03.313 回答