【问题标题】:What's the conventional way to send commands to running processes?向正在运行的进程发送命令的传统方式是什么?
【发布时间】:2015-11-28 07:30:13
【问题描述】:

有没有一种传统的方式来编写程序,以便可以从命令行向程序发出命令而无需 repl?例如,如何使用sudo /etc/init.d/nginx restart(或除restart 之外的任何其他有效命令)向正在运行的nginx 服务器发送命令

我的一个想法是让长期运行的程序创建并监视一个 unix 套接字,其他程序可以写入该套接字以向其发送命令。另一个是创建一个带有 REST 接口的本地服务器,可以通过这种方式发送命令,尽管这看起来有点粗俗。

这样做的正确方法是什么?

【问题讨论】:

  • 请注意,运行程序必须配备处理消息。有很多方法可以做到这一点,但无论选择哪种方法都必须编码到正在运行的程序中。例如,没有办法让长时间运行的 shell 脚本通过尝试通信来改变其行为(除了非常粗暴地通过信号杀死它,或者通过附加调试器而不那么粗暴,但这需要特权)来自另一个进程。通常,运行程序的设计将决定您如何组织事物。

标签: sockets unix ipc unix-socket


【解决方案1】:

两种方式都可以,您甚至可以考虑使用一些RPC 机制,例如让您的应用程序在一些unix(7) 套接字上服务JSONRPC。或使用fifo(7)。或者使用D-Bus

Unix 上的一个常见习惯是让应用程序重新加载其配置文件,例如SIGHUP 发出信号,并在 SIGTERM 上保存一些持久状态(终止前)。阅读signal(7)(请注意,只能从信号处理程序调用异步信号安全例程;一个好方法是只在处理程序内部设置一些volatile sig_atomic_t 变量并在外部进行测试)。另请参阅 POSIX signal.h 文档。

您可以让您的应用程序成为一个专门的 HTTP 服务器(例如,使用一些 HTTP 服务器库,如 libonion)并为其提供一些 Web 界面(或 REST,或 SOAP ...);然后用户(或系统管理员)将使用他的浏览器与您的应用程序交互。

您可以使您的服务器systemd 兼容。 (我不知道具体需要什么,可能与 D-bus 有关)。

您可以在您的应用程序中嵌入一些命令解释器(如GuileLua),并在一些IPC 上运行一些有限类型的REPL 循环,如套接字或fifo。当心讨厌的code injection

【讨论】:

  • 您还可以使用 SIGUSR1 和 2,我建议您不要使用 HUP 或 TERM 做一些意想不到的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多