所以情况就是这样,我们有一个 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 上运行