是否有用于与长时间运行的进程进行通信的标准 linux/unix 模式?
例如,我有几百个进程,用 C++ 编写,并在各种机器上运行,我想通过 shell 脚本向它们发送一个命令,如重新加载配置、启动、停止等。
是否有用于与长时间运行的进程进行通信的标准 linux/unix 模式?
例如,我有几百个进程,用 C++ 编写,并在各种机器上运行,我想通过 shell 脚本向它们发送一个命令,如重新加载配置、启动、停止等。
如果您尝试触发简单的操作,如您所描述的启动/停止/重新加载配置,最常见的方法是使用信号。
在您的 shell 脚本中,您可以使用该kill
命令将特定信号发送到特定进程。在您的流程中,您将实现一个或多个信号处理程序。信号处理程序被注册以通过使用signal()
函数或sigaction()
函数接收一个或多个信号。
通常SIGHUP
用于触发重新加载配置。SIGSTOP
并且SIGCONT
可能适合暂停和恢复。
man 7 signal
将向您显示可供选择的可用信号的完整列表。
如果您需要触发更复杂的操作,您可以创建命名管道。让您的进程创建管道,并从您的 shell 脚本中,echo
向它发送命令。
由于您还关心远程进程,并且假设您可以修改所有程序的源代码,您可以考虑一些与它们通信的方式:
定义您自己的小型文本协议,并让每个进程侦听某个套接字或某个命名管道。您可能需要一些多路复用系统调用,例如poll
使用现有的库和工具,如MPI、Corba或D-Bus或ONC/RPC/XDR
更改应用程序的配置文件,并具有信号约定,例如 catchSIGHUP
以重新加载配置并SIGTERM
正确终止它(但无法远程发送信号;您需要例如ssh
某些kill
命令)。