我正在寻找一种方法,可以从Go程序中启动一个完全独立的程序实例。到目前为止,这是我最好的尝试:
// Some code
go exec.Command("konsole", "--hold", "--separate", "sh", "-e", "go", "run", "test.go")
.Run()
// Continue doing something else then quit
使用linux KDE的Konsole。这个命令“几乎”有效-它启动一个新的Konsole实例并运行程序。但它们是相关的:如果第一个程序结束(ctrl+c),第二个程序也会结束。有没有办法解决这个问题?
发布于 2020-03-21 00:40:29
为了实现它,您需要用os.StartProcess
替换exec.Command
调用,并给出额外的进程属性os.ProcAttr
和syscall.SysProcAttr
。设置标志Setpgid
并使Pgid
的默认值为0可以达到@that_other_guy提到的目标。
package main
import (
"fmt"
"os"
"os/exec"
"syscall"
)
func main() {
cmd, err := exec.LookPath("sleep")
if err != nil {
panic(err)
}
attr := &os.ProcAttr{
Sys: &syscall.SysProcAttr{
Setpgid: true,
},
}
process, err := os.StartProcess(cmd, []string{cmd, "1m"}, attr)
if err != nil {
panic(err)
}
fmt.Println(process.Pid)
process.Release()
for {
}
return
}
https://stackoverflow.com/questions/60344073
复制相似问题