3

是否有用于与长时间运行的进程进行通信的标准 linux/unix 模式?

例如,我有几百个进程,用 C++ 编写,并在各种机器上运行,我想通过 shell 脚本向它们发送一个命令,如重新加载配置、启动、停止等。

4

3 回答 3

6

信号。

于 2012-04-05T03:06:07.283 回答
2

如果您尝试触发简单的操作,如您所描述的启动/停止/重新加载配置,最常见的方法是使用信号

在您的 shell 脚本中,您可以使用该kill命令将特定信号发送到特定进程。在您的流程中,您将实现一个或多个信号处理程序。信号处理程序被注册以通过使用signal()函数或sigaction()函数接收一个或多个信号。

通常SIGHUP用于触发重新加载配置。SIGSTOP并且SIGCONT可能适合暂停和恢复。

man 7 signal将向您显示可供选择的可用信号的完整列表。


如果您需要触发更复杂的操作,您可以创建命名管道。让您的进程创建管道,并从您的 shell 脚本中,echo向它发送命令。

于 2012-04-05T03:35:35.883 回答
1

由于您还关心远程进程,并且假设您可以修改所有程序的源代码,您可以考虑一些与它们通信的方式:

  • 定义您自己的小型文本协议,并让每个进程侦听某个套接字或某个命名管道。您可能需要一些多路复用系统调用,例如poll

  • 使用现有的库和工具,如MPICorbaD-BusONC/RPC/XDR

  • 更改应用程序的配置文件,并具有信号约定,例如 catchSIGHUP以重新加载配置并SIGTERM正确终止它(但无法远程发送信号;您需要例如ssh某些kill命令)。

于 2012-04-05T04:53:26.927 回答