我在golang中发现了一个奇怪的问题。如果父进程被os.Interrupt信号中断,那么由exec.Start()
执行的程序将会退出,而如果父进程以正常方式退出,则子进程不会退出。这两种情况有何区别呢?
例如:
package main
import "fmt"
import "os"
import "time"
import "os/exec"
func main(){
cmd := exec.Command("sleep", "100000")
cmd.Env = os.Environ()
fmt.Println(cmd.Env)
cmd.Start()
time.Sleep(1e9*20)
return
}
在这种情况下,如果我们没有打断主程序,在20秒后
sleep 100000
的父进程将会是init进程
。
cmd.SysProcAttr = &syscall.SysProcAttr{CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP}
来防止这种行为。在POSIX上,我相信应该使用Setsid
或Setpgid
。 - AndreKRcmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true, Pgid: 0}
- Arxeiss