Я хотел бы написать небольшую программу 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
все еще выполняет свою обычную функцию проверки связи, но есть также запущенная программа, выполняющая мониторинг при запуске через мою маленькую программу. Серверу вообще не нужно было знать о мониторе, когда он собирался из исходного кода (т.е. мне не нужно было перестраивать двоичный файл сервера, чтобы добавить эту функциональность).
Мои вопросы:
Как бы я сделал это в Go (чтобы я мог запустить его в отладочной среде по крайней мере, даже если он немного ненадежный)?
Как мне сделать это БЕЗОПАСНО в Go (чтобы я мог запустить его в производственной среде без запуска всех ядерных программ)?