Как заставить подпроцесс go загрузить плагин? - PullRequest
0 голосов
/ 05 ноября 2019

Я хотел бы написать небольшую программу 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 все еще выполняет свою обычную функцию проверки связи, но есть также запущенная программа, выполняющая мониторинг при запуске через мою маленькую программу. Серверу вообще не нужно было знать о мониторе, когда он собирался из исходного кода (т.е. мне не нужно было перестраивать двоичный файл сервера, чтобы добавить эту функциональность).

Мои вопросы:

  1. Как бы я сделал это в Go (чтобы я мог запустить его в отладочной среде по крайней мере, даже если он немного ненадежный)?

  2. Как мне сделать это БЕЗОПАСНО в Go (чтобы я мог запустить его в производственной среде без запуска всех ядерных программ)?

1 Ответ

3 голосов
/ 05 ноября 2019

Уже созданное приложение Go не поддерживает загрузку «предопределенных» или других плагинов по умолчанию. Вы должны изменить приложение, вы должны заставить его искать или ожидать, что плагин будет загружен.

Хотя что-то подобное легко могло бы быть возможно, если бы инструмент go генерировал бинарный файлэто будет искать плагин "default.so" или флаг командной строки, например -autoload=pluginname, но это не так.

Большинство библиотек решают эту проблему, требуя, чтобы приложение импортировало их, что запускает любой мониторингпроцесс, который они хотят. Что хорошо для большинства применений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...