golang 常规应该如何向已经运行的程序发送带参数的指令?

2023-07-04 20:26:22 +08:00
 raw0xff

想让程序在运行时通过外部命令(带参数)执行不同的函数方法。比如可执行程序是"imabin",imabin 已经运行中,在命令行“imabin add='xxx' host='xxx' port='xxx'”可以让已经运行的进程执行相应的函数,是不是应该这样操作?这样做是不是还要考虑重复启动和查找已经运行的进程的问题,有没有别的方式?

用信号的话,不可以带参数而且只有两个自定义信号。 用端口通信的话,是不是没必要?

大佬的常规做法是怎样?

2164 次点击
所在节点    Go 编程语言
27 条回复
lhbc
2023-07-04 20:31:02 +08:00
搞个配置文件,配置监听端口或者 socket 或者 pid
再次运行的时候读取配置,检查相应的端口或者 socket ,然后向进程发送你的参数
raw0xff
2023-07-04 20:51:38 +08:00
@lhbc 感谢大佬,监听端口是为了做已运行的标记还是为了接收参数?“然后向进程发送你的参数”是用 tcp 或者 udp 向端口发参数吗?这是常规做法吗?
thinkershare
2023-07-04 20:59:24 +08:00
不同操作系统有自己的互斥体试下,程序启动时候检查这个互斥体,然后做去重处理。然后检查到已被持有后,转发命令行参数到已运行进程,已运行进程可用使用 TCP/进程管道/文件监听等多种方式来获取刚刚启动程序传递的参数。没有什么常规不常规。要看你的实际需求。有很多方法可用做到你需要的这种操作。
thinkershare
2023-07-04 21:00:14 +08:00
互斥体实现
0o0O0o0O0o
2023-07-04 21:01:15 +08:00
viper
aloxaf
2023-07-04 21:04:09 +08:00
哪种方法最常规不知道,但最简单的肯定是直接用官方的 rpc 包: https://pkg.go.dev/net/rpc
不同实例就监听不同端口
rrfeng
2023-07-04 21:04:26 +08:00
明显是个 X-Y problem ,请说出你的原始需求。
yianing
2023-07-04 22:02:20 +08:00
docker 和 caddy 都是监听一个 unix socket 通信
Vegetable
2023-07-04 22:23:19 +08:00
常见的 daemon+cli 模式呗,比如 docker
lhbc
2023-07-04 22:26:47 +08:00
@raw0xff 这要涉及到进程间通讯
无非就是 tcp 或者 socket 这几种

端口和 socket, pid 都可以用于标识进程已运行
dobelee
2023-07-04 22:31:34 +08:00
都用 go 了,起个服务,可扩展性更高。
flyqie
2023-07-04 22:56:11 +08:00
搞个 unix domain socket 完事。

要是只用一个 mgr 管理的话,甚至可以直接 stdin stdout stderr 结合实现。。

避免重复启动和查找已运行进程用 pid file 实现(即使 pid file 存在最好也要做几次检查,看看 pid file 里面的 pid 到底是否存在,避免意外结束导致 pid file 没有正确释放),非常追求唯一性的话可以考虑搞一下其他类型的锁来辅助。

如果直接带参跑新进程来做数据交换的话,不灵活,也不好改。
raw0xff
2023-07-04 23:38:17 +08:00
@yianing
@Vegetable 对,就是想实现像 docker 那样“docker+命令+参数”这种操作。请问大概实现方式是啥我去搜搜。


@thinkershare 感谢老哥,我去查查。
ETiV
2023-07-04 23:56:38 +08:00
docker 是 C/S 架构

你用的 docker + 命令 + 参数,docker 其实是客户端,用它来生成参数向 dockerd 这个进程发请求。dockerd 监听在本地 socks 文件上,可以为它配置权限属性,避免非授权访问…

所有功能上的事儿都是 dockerd 去完成的,比如 docker pull ,是 dockerd 在 pull…

====
当然你也可以像 hashicorp vault 那样,一个可执行程序,根据参数不同,既当 server 又当 client
wweir
2023-07-05 05:50:58 +08:00
前面说了那么多基于 rpc 通讯的方案,再说两个基于信号、文件监听的方案
1 、用 notify 监听配置文件的变动,执行对应动作
2 、监听指定 signal ,执行对应动作,动作里面可以包括读指定文件
Nazz
2023-07-05 10:21:22 +08:00
试试 unix socket ?
我这个库封装了 websocket 服务端和客户端, 支持 unix socket 作为传输层
https://github.com/lxzan/gws
MoYi123
2023-07-05 11:16:32 +08:00
经典八股文之《进程间的通信方式》 , 里面随便挑一种就行.
julyclyde
2023-07-05 12:58:22 +08:00
@wweir inotify 的话有竞争情况
下发多个指令的时候,发指令和收指令方的节奏不容易协调

signal 的信息量太简略了
ttvast
2023-07-05 13:46:48 +08:00
shm+signal
proxytoworld
2023-07-05 14:06:35 +08:00
go 可以动态解析配置文件啊,监测到配置文件修改则重新读取,解析参数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/954095

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX