我有一个程序可以在后台运行,不需要任何干预。
但是,我想提供对运行实例的一些控制。用法可能像这样:
$ foo start
# an instance starts running in the background
$ foo refresh bar,baz
# the running instance does something with bar and baz
实现这类东西的典型方法是什么?有没有一种方法可以在实例之间共享通道?我如何首先定位现有实例?
典型的方法是使用客户机-服务器方法。
foo start
可以启动服务器。从macOS shell将其作为后台守护进程启动:
pkill foo && nohup foo start > out.log 2>&1 &
或者简单地(在某些情况下可能足够):
foo start &
在Linux上,它可以配置为systemd服务,init脚本或cron作业。
foo refresh
可以是向正在运行的守护进程实例发送请求的客户端。
如果你只需要单向通信,一个典型的方法是使用HTTP(例如,在服务器端使用warp,在客户端使用request)。在这种情况下,定位运行实例的一种方法是定义一个恒定的共享端口号,例如12345。然后服务器可以监听"localhost:12345",客户端可以请求"http://localhost:12345/refresh?ids=bar,baz"。
如果您不想增加库的开销,并且您的通信协议如您所描述的那样简单,那么最简单的方法就是使用共享文件。在这种情况下,定位运行实例的一种方法是定义一个恒定的共享文件名,例如"/var/run/foo/request.txt"。然后客户端向该文件写入一行"刷新栏",服务器检测到更改,读取它并执行一些操作(可能输出对相同文件或其他共享文件的响应)。