【问题标题】:What's the most idiomatic way to implement "live communication" with a process?用流程实现“实时通信”的最惯用方式是什么?
【发布时间】:2021-12-09 13:52:59
【问题描述】:

我有一个程序在后台运行,无需任何干预。

但是,我想对正在运行的实例提供一些控制。用法可能如下所示:

$ foo start
# an instance starts running in the background
$ foo refresh bar,baz
# the running instance does something with bar and baz

实现这样的事情的典型方式是什么?有没有办法以某种方式在实例之间共享通道?我如何首先定位现有实例?

【问题讨论】:

  • 这不一定是 Rust 特定的,因为您正在谈论进程间通信。您可以使用任何常见的 IPC 机制,例如:UNIX 套接字、信号、命名管道、共享内存、TCP/UDP 套接字、文件等。

标签: rust process ipc daemon channel


【解决方案1】:

一种典型的方法是使用客户端-服务器方法。

foo start 可以启动服务器。 从 macOS shell 作为守护进程在后台启动它:

pkill foo && nohup foo start > out.log 2>&1 &

或者简单地说(在某些情况下可能就足够了):

foo start &

在 Linux 上,它可以配置为 systemd 服务、初始化脚本或 cron 作业。

foo refresh 可以是向正在运行的守护程序实例发送请求的客户端。

如果您只需要单向通信,一种典型的方法是使用 HTTP(例如,对服务器使用 warp,对客户端使用 reqwest)。在这种情况下,定位正在运行的实例的一种方法是定义一个常量共享端口号,例如12345。然后服务器可以监听“localhost:12345”,客户端可以请求“http://localhost:12345/refresh?ids=bar,baz”。

如果您不想要库的开销,并且您的通信协议如您所描述的那样简单,那么最简单的方法是使用共享文件。在这种情况下,定位正在运行的实例的一种方法是定义一个常量共享文件名,例如“/var/run/foo/request.txt”。然后客户端向该文件写入一行“refresh bar,baz”,服务器检测到更改,读取它并执行某些操作(可能将响应输出到同一文件或其他共享文件)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-07
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2014-02-08
    • 2021-10-18
    • 1970-01-01
    相关资源
    最近更新 更多