0

所以情况就是这样,我们有一个 C++ 数据馈送客户端程序,我们运行大约 30 个具有不同参数的实例,并且编写了 3 个脚本来运行/停止它们:start.sh stop.sh 和 restart.sh(运行 stop .sh 然后 start.sh)。

当有大量数据时,客户端会实时“落后”。我们通过将系统时间与列出的最新数据输入时间进行比较来测试这一点。如果任何客户端落后超过 10 分钟左右,我想调用重新启动脚本以重新启动所有二进制文件,以便我们的数据尽可能接近实时。

通常我使用 System(script.sh) 调用脚本,但是重新启动脚本会查找并使用 kill 杀死进程,但是调用 System() 也会使当前程序执行忽略 SIGQUIT 和 SIGINT,直到 system() 返回。

最重要的是,如果有两个具有相同参数的并发执行,它们将发生冲突并且程序将挂起(这源于建立数据库连接),所以我无法启动新实例,直到旧实例被杀死并且我不能杀死如果它忽略 SIGQUIT,则为当前的。

有没有办法解决?二进制文件的当前状态和丢失的一些数据如果达到阈值则根本无关紧要,我也不能让程序自行重启,因为如果其中一个实例落后,我们想重新启动所有 30 个实例(因此数据中的差距在同一时间)。是否有一种干净的方法可以从 C++ 中调用脚本,该脚本移交控制权并允许脚本从头开始重新启动程序?

仅供参考,我们在 CentOS 6.3 上运行

4

2 回答 2

2

使用exec()而不是system(). 它将用新的流程替换您的流程。exec()请注意,调用方式和行为方式存在显着差异:system()将其字符串参数传递给系统 shell 以运行。 exec()实际上执行一个可执行文件,并且您需要一次向进程提供一个参数,而不是让 shell 为您解析它们。

于 2013-07-09T20:10:41.803 回答
0

这是我的两分钱。

临时解决方案:使用 SIGKILL。
长期解决方案:优化您的代码服务树的一般逻辑,使用其他系统调用,如 exec 或重写它以使用线程

如果您想要更好的答案,也许您应该发布一些代码和/或将问题概括化。

于 2013-07-09T20:11:48.403 回答