我想写一个小的Go程序来监视另一个Go程序,并报告有关它的定期遥测。但是,我希望不要求被监视程序包含监视代码或显式加载监视代码。
因此,例如,给出以下惊人的服务器程序:
server.go:
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println("ping")
time.Sleep(2 * time.Second)
}
}
以及以下出色的监控代码,它们是作为插件构建的:
monitor.go:
package main
import (
"fmt"
"time"
)
func init() {
go func() {
for {
fmt.Println("doing monitoring stuff...")
time.Sleep(1 * time.Second)
}
}()
}
我想通过exec
调用或其他方式启动服务器二进制文件,强制服务器进程将monitor.so
作为插件加载(运行监视器的init()
函数),然后服务器会继续执行通常不会发生的事情。
最终结果是server
仍在执行其常规ping操作,但是当通过我的小程序启动时,还有一个正在运行的goroutine在进行监视。从源代码构建服务器时,服务器完全不需要了解监视器(即,我不需要重建服务器二进制文件即可添加此功能)。
我的问题是:
-
我该如何在Go中执行此操作(以便即使它有点片状,也可以至少在调试环境中运行它)?
-
在Go中如何安全(以便我可以在生产环境中运行它而无需启动所有核武器)?