情况如下:
我们有一个主应用程序和一个观察程序应用程序。它们都是 c++ 应用程序。它们都使用 daemon(1,0) 函数。
Watcher 检查主应用程序是否正在运行,如果它发现主进程不存在(崩溃)或主进程没有响应(应用程序通过 TCP 相互“对话”,这就是它如何知道它是否挂起)然后它运行主进程或重新启动它。
现在,用户可以更改连接的 TCP 设置,并通过主应用程序完成。更改后,必须重新启动 watcher 以加载新配置。这是从主应用程序完成的。
事实上,它工作正常。
1. 在启动时主应用程序确实会杀死现有的观察者进程并再次运行它。[这是正确的]
2. Watcher 应用程序确实会杀死 main 并再次运行它。[这是对的]
但
- 如果我运行 Main,而后者又启动 Watcher,
- 然后杀死 Main,让 Watcher 一个人呆着。
- Watcher 看到没有 Main 了,所以它再次启动它。
- Main 再次启动,杀死观察者并尝试再次启动它....
- 在这一点上,发生了某种无意义的事情。它启动了观察者(我可以看到通过 netstat 命令获取的 TCP 端口),但没有名为观察者的进程。
如果正常 netstat 显示tcp 0 0 IP:TCP_PORT LISTEN Watcher
,现在它显示tcp 0 0 IP:TCP_PORT LISTEN Main
。
就好像观察者在那里,但在主进程中。
我使用脚本来运行应用程序。观察者使用这个
#!/bin/sh
killall -9 Main
./Main
并像运行它一样system("./runMain.sh&");
主要用这个
#!/bin/sh
killall -9 Watcher
./Watcher
并像运行它一样system("./runWatcher.sh&");
我究竟做错了什么?我如何运行它们,以便它们可以在需要时相互重新启动并始终在单独的进程中启动?
到目前为止,我还尝试使用 运行脚本nohup
,结果是一样的。
编辑1:
注意:这里的数字只是为了清楚起见。实际上PID当然不是1。
我运行主要。netstat 向我展示:
tcp 0 0 192.168.0.1:7000 LISTEN (PID 1)Main
tcp 0 0 192.168.0.1:7001 LISTEN (PID 1)MainMain 使用脚本启动 Watcher。现在 netstat 向我展示:
tcp 0 0 192.168.0.1:7000 LISTEN (PID 1)Main
tcp 0 0 192.168.0.1:7001 LISTEN (PID 1)Main
tcp 0 0 192.168.0.1:8000 LISTEN (PID 2)Watcher现在,我通过执行手动杀死 Main
killall -9 Main
。现在 netstat 向我展示:tcp 0 0 192.168.0.1:7000 LISTEN (PID 2)Watcher
tcp 0 0 192.168.0.1:7001 LISTEN (PID 2)Watcher
tcp 0 0 192.168.0.1:8000 LISTEN (PID 2)Watcher注意到现在谁拥有监听套接字的变化了吗?那是怎么发生的?
Watcher 看到 Main 已经消失,因此它使用脚本文件启动它。
Main 在启动时杀死 Watcher。Netstat 显示:
tcp 0 0 192.168.0.1:7000 LISTEN (PID 3)Main
tcp 0 0 192.168.0.1:7001 LISTEN (PID 3)Main
tcp 0 0 192.168.0.1:8000 LISTEN (PID 3)Main
就是这样。Watcher 再也不会运行了。我尝试在 Eclipse 中进行调试,Watcher 崩溃而没有直接上线daemon(1,0)
。