我有一个作为Linux服务运行的C ++程序。某些程序的命令行选项只是在其配置文件中设置值然后退出,然后需要服务重新启动以获取新配置。为了使服务能够不间断地继续运行,它的工作原理如下:
当程序在读取新配置后重新启动时,我正在调用execv,使其保持与原始实例相同的进程空间,以便它可以继续作为服务进行管理。问题是execv没有按预期运行,而是终止现有流程并重新启动新流程。因为PID不再匹配,如果我在此之后尝试运行'service progname stop / restart',它将无法正常工作,'stop'将使服务保持运行,'restart'将产生一个重复的程序实例
我已经确认传递给execv的argv [0]是可执行文件的完整路径,因此它不应该通过shell在PATH中搜索可执行文件(这也应该是因为我'我使用execv代替execvp),我已经读到了在其他应用程序中引起类似问题。
答案 0 :(得分:0)
发现问题,问题是程序在启动时使用daemon(),它在内部执行fork / exec,并且在重新启动程序时它再次调用daemon()。在增强它以区分启动/重启并避免再次调用守护进程()之后,问题就解决了。