所以情况就是这样,我们有一个C ++ datafeed客户端程序,我们运行~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上运行
答案 0 :(得分:2)
使用exec()
代替system()
。它将用新的流程取代您的流程。请注意,exec()
的调用方式和行为方式有很大不同:system()
将其字符串参数传递给系统shell以运行。 exec()
实际上执行了一个可执行文件,你需要一次向进程提供一个参数,而不是让shell为你解析它们。
答案 1 :(得分:0)
这是我的两分钱。
临时解决方案:使用SIGKILL 长期解决方案:优化代码或服务树的一般逻辑,使用其他系统调用(如exec)或重写它以使用线程
如果你想要更好的答案,也许你应该发布一些代码,或者 degeneralize 这个问题。