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

331 天前
 raw0xff

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

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

大佬的常规做法是怎样?

1940 次点击
所在节点    Go 编程语言
27 条回复
harrozze
330 天前
@julyclyde #18 他的意思是把要执行的动作放到文件里,通过 signal 让正在运行的进程去读一下,然后执行。这种在频率不高的情况下可行,包括通过 signal 重读配置文件都可以,kill -HUP 经常用来干这事儿。但其实整套实现方案还是得根据具体情况进行选择,signal 重新初始化+旧子进程优雅退出,还是 socket/fifo 的方式发命令。另:notify 监听文件改变的方式在生产线上不可取,监听到事件到执行命令之间需要有个相对严格的验证文件正确性的过程,文件改变即执行的方式不容易做到。
raw0xff
330 天前
@proxytoworld 正在看这个
wweir
330 天前
@harrozze 哈哈哈,一看就是琢磨过干过这事的人
julyclyde
329 天前
@harrozze inotify 其实也可以校验正确性再加载,这倒不是问题

问题在于:发指令方如用“覆盖命令文件”的方式发了多次指令,但被指令方也许只读了一次配置文件,从而丢失了中间的其他指令;如果选用往命令文件内 append 内容的方式,又涉及到:被指令方应该从上次记忆的位置开始读文件、旧文件是否应该删除以节省空间、rotate 之后需要从头开始读之类的破事。虽然最终也可能达到正确,但是开发者的时间都浪费掉了


fifo ,多个指令一起发过来,存在打开文件冲突的问题

listen socket+多个 accept 的方式是相对靠谱的
harrozze
329 天前
@julyclyde #24 对,监控文件改动就去执行的方式,缺点就是缺乏一个明确的信号,容易漏,容易出错误(比如,如果不知道需要把所有指令一次性写入的话,有可能会一行甚至半行式的增加文件内容)导致非预期的结果。
raw0xff
329 天前
@julyclyde
@harrozze
看大佬对话受益匪浅,分析了一下自己的需求场景,多用户同时访问的机率为 0 ,用户只有我自己,所以我选修改配置文件后-HUP 。
ducks
290 天前
mq:没错正是在下!

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

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

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

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

© 2021 V2EX