gpt4 book ai didi

go - 启动守护进程但直到守护进程启动进程在 golang 中完成后才继续

转载 作者:IT王子 更新时间:2023-10-29 01:41:23 27 4
gpt4 key购买 nike

我有两个程序

  1. 通话 (2)
  2. 启动守护进程(服务器)(如果尚未启动)然后对该服务器执行一些 RPC

我尝试在 (2) 中使用 cmd.Run() 启动守护进程,但是 (1) 中的 cmd.Run() 仍在运行永远,可能是因为守护进程子进程挥之不去。

cmd := exec.Command("daemonbinary")
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
cmd.Run()

// do other stuff and eventually exit the program would not work

然后我想我应该改用 cmd.Start(),但问题是我必须等待守护进程真正启动才能继续。

如何实现?

回顾一下,我想要实现的是:

  • 启动 (2) 中的守护进程(如果它尚未运行)并使其无限期运行
  • 仅当该守护进程正确启动时才在 (2) 中继续
  • 从 (2) 中干净地退出,并且 (2) 进程和守护进程之间没有任何“关系”挥之不去。

编辑:

我尝试在单独的进程组中启动它:

    cmd.SysProcAttr = &syscall.SysProcAttr{
Setpgid: true,
Pgid: 0,
}

这似乎不起作用。

编辑 2:

我只是删除了附加 os.Stdoutos.Stderr 的两行,现在上面的内容似乎可以正常工作了。

然而,在程序运行时拥有 stdoutstderr 会很好吗?

最佳答案

你所描述的情况听起来像是进程控制系统/编排器的东西,比如 docker-composesupervisord,它允许你在单独的进程中运行服务,检查他们的状态。

如果您坚持留在 Go 中,我建议您定期从守护进程 StdoutPipe 中读取新内容,直到它出现并根据它采取行动。但我发现这个解决方案很老套。

package main

import (
"fmt"
"log"
"os/exec"
"time"
)

func main() {
cmd := exec.Command("bash", "-c", "sleep 2 && echo started && sleep 5")
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatal(err)
}

if err := cmd.Start(); err != nil {
log.Fatal(err)
}

buffer := make([]byte, 7)
for {
stdout.Read(buffer)
if string(buffer) == "started" {
break
}
time.Sleep(500 * time.Millisecond)
}
fmt.Println("Daemon started")

yourRPCStuff()

if err = cmd.Process.Kill(); err != nil {
log.Fatal("Failed to kill daemon: ", err)
}
}

关于go - 启动守护进程但直到守护进程启动进程在 golang 中完成后才继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45567945/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com