1

情况如下:

我们有一个主应用程序和一个观察程序应用程序。它们都是 c++ 应用程序。它们都使用 daemon(1,0) 函数。

Watcher 检查主应用程序是否正在运行,如果它发现主进程不存在(崩溃)或主进程没有响应(应用程序通过 TCP 相互“对话”,这就是它如何知道它是否挂起)然后它运行主进程或重新启动它。

现在,用户可以更改连接的 TCP 设置,并通过主应用程序完成。更改后,必须重新启动 watcher 以加载新配置。这是从主应用程序完成的。

事实上,它工作正常。
1. 在启动时主应用程序确实会杀死现有的观察者进程并再次运行它。[这是正确的]
2. Watcher 应用程序确实会杀死 main 并再次运行它。[这是对的]

  1. 如果我运行 Main,而后者又启动 Watcher,
  2. 然后杀死 Main,让 Watcher 一个人呆着。
  3. Watcher 看到没有 Main 了,所以它再次启动它。
  4. Main 再次启动,杀死观察者并尝试再次启动它....
  5. 在这一点上,发生了某种无意义的事情。它启动了观察者(我可以看到通过 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。

  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)Main

  2. Main 使用脚本启动 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

  3. 现在,我通过执行手动杀死 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

    注意到现在谁拥有监听套接字的变化了吗?那是怎么发生的?

  4. Watcher 看到 Main 已经消失,因此它使用脚本文件启动它。

  5. 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)

4

1 回答 1

0

使用自定义信号(甚至在另一个端口上监听管理命令)怎么样?使用 kill -9 正在玩弄进程树,例如子进程获得对父资源(端口等)的控制权

那么,除此之外,当 Watcher 启动 Main 进程时,为什么它会假设正在运行的 Watcher 实例应该被杀死呢?一个原因是现在 Watcher 是 Main 的父级,所以我可以看到这会如何造成麻烦。

归结为两个进程需要在“kill”信号之外进行通信。

使用信号量或其他一些操作系统级别的通信机制在两者之间进行协调。

于 2013-07-09T19:54:20.800 回答