unix 向正在运行的进程发送命令的传统方式是什么?

quhf5bfb  于 2022-11-23  发布在  Unix
关注(0)|答案(2)|浏览(152)

有没有一种传统的方法来编写一个程序,这样命令就可以从命令行发送到程序,而不需要repl?例如,如何使用sudo /etc/init.d/nginx restart(或除restart之外的任何其他有效命令)向正在运行的nginx服务器发送命令
我的一个想法是让长时间运行的程序创建并监控一个unix套接字,其他程序可以写入该套接字并向其发送命令。另一个想法是创建一个带有REST接口的本地服务器,可以通过该接口发送命令,尽管这似乎有点恶心。
正确的做法是什么?

anauzrmj

anauzrmj1#

这两种方法都可以,你甚至可以考虑使用一些RPC机制,比如让你的应用程序在一些unix(7)套接字上服务JSONRPC,或者使用fifo(7),或者使用D-Bus
Unix上的一个常见习惯是让应用程序在例如SIGHUP信号上重新加载它们的配置文件,并在SIGTERM上保存一些持久状态(在终止之前)。读取signal(7)(注意只有async-signal-safe例程可以被信号处理程序调用;一个好的方法是只在处理程序内部设置一些volatile sig_atomic_t变量,然后在处理程序外部测试它。
您可以让您的应用程序成为一个专门的HTTP服务器(例如,使用一些HTTP服务器库,如libonion),并为它提供一些Web接口(或REST,或SOAP...);然后用户(或系统管理员)将使用他的浏览器与您的应用程序进行交互。
你可以让你的服务器兼容systemd。(我不知道具体需要什么,也许是D总线相关)。
你可以在你的应用中嵌入一些命令解释器(比如GuileLua),并在一些IPC上运行一些有限的REPL循环,比如套接字或fifo。

6qqygrtg

6qqygrtg2#

我有一个类似的问题,我有过多的服务运行在任何数量的机器上,每个都需要与其他几个通信。
我的主要问题并不是服务之间的通信,这可以通过一个简单的消息通过连接来完成(正如Basile所提到的,它可以是TCP、UDP、Unix套接字、FIFO......)但是,当您有超过20个服务,其中许多服务需要与其他几个服务通信时,您开始为如何正确地获得所有连接而头疼(我有这样一个系统,尽管它的服务数量相对有限,只有10个,这已经非常复杂了)。
所以我创造了一个过程(又一项服务)。所有服务都连接到 * Communicator* 服务,当它们需要发送消息时,它们包括它们要访问的服务的名称。Communicator 服务负责将消息发送到正确的位置-即,它可以发送到在不同计算机上运行的另一个 Communicator 服务。Communicator 具有网络上所有可用服务的图形,并且知道如何向这些服务发送消息,而您的服务不必了解所有这些信息。计算图形可能非常复杂。
为此,我创建了eventdispatcher项目。它是用C编写的,这可能不是您感兴趣的,尽管您可以在与C/C接口的其他语言中使用它。消息的结构是“专有的”。(特定于 * 通信器 *),但您可以创建任何所需的消息。消息包括名称和参数(param-name=value)。第一个版本有一个简单的单行文本通信系统。较新的版本也接受JSON(每条消息仍然必须是一行文本)。
该系统支持TCP、UDP、Unix套接字、FIFO,线程之间可以有线程安全FIFO,也可以理解信号(例如SIGHUP、SIGTERM、它有一个特定的连接来监听线程的死亡。它通过OpenSSL支持TCP加密。消息可以自动调度(因此是库的当前名称)。连接被分配了一个计时器。还有CUI和GUI(Qt)扩展。
这里的一个要点是可以轮询所有连接(参见poll()),因此您可以实现对事件作出React的系统,而不是休眠并检查事件、休眠并检查等的系统。您有一个阻塞连接,并且所有操作都必须在该连接上进行,否则您的服务将被阻塞。这也是Unix一直使用信号的原因之一,因为早期版本的Unix没有select()poll()

相关问题