有谁知道如何在 golang (Go) 中运行分离命令?
任务是:我有 app1 和 app2,app2 做大而长的工作,大约。2 小时。但是 app1 是默认应用程序,它可以在几分钟内完成工作,每天调用 1-2 次。实际上,我需要运行 app1,而不是在 app1 gorutine 中运行 app2,app1 将完成其工作并关闭,但 app2 必须仍然工作,直到其任务列表结束。如果运行 2-3 个 app2 实例,这可能是正常情况。
我需要smth。像这样,我在 bash 中做什么:
$ ./my-app &
...或在 Qt 中:
QProcess prc;
prc.setArguments(args);
prc.setProgram(app2);
prc.setWorkingDirectory(dir);
prc.startDetached();
Qt 文档:
bool QProcess::startDetached(qint64 *pid = nullptr)
在新进程中使用参数启动程序,并从中分离...如果调用进程退出,分离的进程将继续运行而不受影响。启动的进程将在其自己的会话中运行,并像一个守护进程一样运行。如果函数成功,则 *pid 设置为已启动进程的进程标识符。请注意,子进程可能会退出,PID 可能会变为无效,恕不另行通知。此外,子进程退出后,同一个PID可能会被完全不同的进程回收使用。
所以,我在 Go 中这样做:
cmd := exec.Command("./app2", "&")
_ = cmd.Run()
...但它没有帮助,'app2' 仍然没有分离。如果我从运行“app2”的地方杀死主app1,那么“app2”也将被关闭。
我也尝试过这种方式:(在app1中)
var attr = os.ProcAttr{
Dir: ".",
Env: os.Environ(),
Files: []*os.File{
os.Stdin,
os.Stdout,
os.Stderr,
},
}
process, err := os.StartProcess(server, []string{"/usr/local/app2"}, &attr)
if err == nil {
err = process.Release()
}
if err != nil {
log.Println(err)
}
并且可以告诉,它也不起作用。
现在我只有一个解决方案:使用 ListenAndServe 将 app2 设为服务器,然后在 app1 中运行 app2,不管如何,但在 gorutine 中:
go func() {
cmd := exec.Command("/usr/local/app2")
_ = cmd.Run()
}()
并在 bash 中将 app1 作为独立进程运行:
./app1 &
在这种情况下,app1 将运行 app2,完成所有工作并关闭,但 app2 将完成所有长期工作。
实际上,我想在 golang(Go 语言)中做与 Qt 中的 QProcess::startDetached 相同的操作(用于扩展 C++ 语言的跨平台应用程序开发框架)
PS。Golang(或 Go,对于在使用 Golang 单词的情况下心脏病发作的语法纳粹分子):顺便说一句,“不过,许多人使用 golang 名称,它作为标签很方便” https://golang.org/doc /常见问题解答#go_or_golang