如何强制go子流程加载插件?

我想写一个小的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在进行监视。从源代码构建服务器时,服务器完全不需要了解监视器(即,我不需要重建服务器二进制文件即可添加此功能)。

我的问题是:

  1. 我该如何在Go中执行此操作(以便即使它有点片状,也可以至少在调试环境中运行它)?

  2. 在Go中如何安全(以便我可以在生产环境中运行它而无需启动所有核武器)?

maxiao258 回答:如何强制go子流程加载插件?

默认情况下,已构建的Go应用程序不支持加载“预定义”或其他插件。您必须更改应用程序,必须 make 搜索或希望加载插件。

如果go工具生成一个二进制文件,该二进制文件将寻找“ default.so”插件或命令行标志,例如-autoload=pluginname,则这样的事情很容易实现,但事实并非如此。 / p>

大多数库通过要求应用程序导入来解决此问题,这将启动它们所需的任何监视过程。多数用途都可以。

本文链接:https://www.f2er.com/3159783.html

大家都在问