使用Golang启动正在运行的程序的另一个实例的好方法是什么?

时间:2019-02-09 21:17:09

标签: go process fork multiprocess

我希望Go程序启动多个将与之交互的进程。 (我也不确定要使用哪种IPC方法,但这也许是另一个问题)

我想到的是使用os.Executable()获取正在运行的可执行文件的位置,然后使用exec包来运行该程序的新实例。我想知道是否还有另一种方法无需查询可执行文件的路径,或者这甚至是我应该担心的行为。

2 个答案:

答案 0 :(得分:1)

建议使用os.Executable在最新版本的Go(see this older SO answer for details)中查找程序自己的路径。然后,您可以使用exec.Command来运行它的更多实例。

尽管这很不寻常,所以我想知道您在这里想到的是哪种用例。根据我的经验,编排多个流程非常棘手,需要解决一个实际问题才能让您值得。

答案 1 :(得分:0)

您是对的,可以执行os.Executable()来执行正在运行的程序的另一个实例:

path, err := os.Executable()
if err != nil {
    log.Println(err)
}
cmd := exec.Command(path)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err = cmd.Start()
if err != nil {
    log.Println(err)
}

我不知道您的情况,但是这样做不是很常见。

除非您正在考虑创建子进程(即fork / exec),否则您可能需要使用cmd.ExtraFiles将额外的文件描述符传递给子进程,并通过信号交换的组合来创建子进程或终止父进程(通常是SIGUSR1和SIGTERM)