Если вывод не слишком велик, вы можете сохранить его в переменной памяти. Я решил подождать результата в случае выполнения сценария (с использованием мьютекса):
package main
import (
"fmt"
"net/http"
"os/exec"
"sync"
"time"
)
var LoopDelay = 60*time.Second
type Output struct {
sync.Mutex
content string
}
func main() {
var output *Output = new(Output)
go updateResult(output)
http.HandleFunc("/feed", initHandle(output))
err := http.ListenAndServe(":8080", nil)
if err != nil {
fmt.Println("ERROR", err)
}
}
func initHandle(output *Output) func(http.ResponseWriter, *http.Request) {
return func(respw http.ResponseWriter, req *http.Request) {
output.Lock()
defer output.Unlock()
_, err := respw.Write([]byte(output.content))
if err != nil {
fmt.Println("ERROR: Unable to write response: ", err)
}
}
}
func updateResult(output *Output) {
var execFn = func() { /* Extracted so that 'defer' executes at the end of loop iteration */
output.Lock()
defer output.Unlock()
command := exec.Command("bash", "-c", "date | nl ")
output1, err := command.CombinedOutput()
if err != nil {
output.content = err.Error()
} else {
output.content = string(output1)
}
}
for {
execFn()
time.Sleep(LoopDelay)
}
}
Выполнение
date; curl http://localhost:8080/feed
дает вывод (при нескольких вызовах):
1 dimanche 13 octobre 2019, 09:41:40 (UTC+0200)
http-server-cmd-output> date; curl http://localhost:8080/feed
dimanche 13 octobre 2019, 09:42:05 (UTC+0200)
1 dimanche 13 octobre 2019, 09:41:40 (UTC+0200)
Несколько вещей, которые следует учитывать:
- Использовано 'дата |nl 'as команда с примером канала
- Если вывод слишком большой, записать в файл
- Скорее всего, рекомендуется оставить мьютекс только для содержимого update (не нужно ждать во время выполнения скрипта) - вы можете попытаться улучшить его
- В подпрограмме Go может быть переменная (канал) для выхода по сигналу (например, когда программа заканчивается)
EDIT: переменная перемещена в основную функцию