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

309 天前
 raw0xff

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

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

大佬的常规做法是怎样?

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

端口和 socket, pid 都可以用于标识进程已运行
dobelee
308 天前
都用 go 了,起个服务,可扩展性更高。
flyqie
308 天前
搞个 unix domain socket 完事。

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

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

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


@thinkershare 感谢老哥,我去查查。
ETiV
308 天前
docker 是 C/S 架构

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

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

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

signal 的信息量太简略了
ttvast
308 天前
shm+signal
proxytoworld
308 天前
go 可以动态解析配置文件啊,监测到配置文件修改则重新读取,解析参数

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

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

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

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

© 2021 V2EX