Macos 使用新进程组id golang启动命令

Macos 使用新进程组id golang启动命令,macos,go,process,Macos,Go,Process,我启动一个命令并存储它的PID,目的是在以后杀死它。由于进程是用创建子进程的命令启动的,因此我必须使用 syscall.Kill(-pid, syscall.SIGINT) 这在Linux中可以正常工作,但在MacOS上不行。原因是,在mac上,当命令启动时,它不会使用不同的进程组创建它,因此向-pid发送信号失败。(如果我将信号发送到pid,它不会终止子进程) 我也尝试使用以下标志启动该命令,但在MacOS上没有帮助 command := exec.Command(commandName,

我启动一个命令并存储它的PID,目的是在以后杀死它。由于进程是用创建子进程的命令启动的,因此我必须使用

syscall.Kill(-pid, syscall.SIGINT)
这在Linux中可以正常工作,但在MacOS上不行。原因是,在mac上,当命令启动时,它不会使用不同的进程组创建它,因此向
-pid
发送信号失败。(如果我将信号发送到
pid
,它不会终止子进程)

我也尝试使用以下标志启动该命令,但在MacOS上没有帮助

command := exec.Command(commandName, arg...)
command.SysProcAttr = &syscall.SysProcAttr{Setpgid: true, Pgid: 0}

新启动的进程获取运行go可执行文件的终端会话的组id,而不是新的进程组id。是否有方法在MacOS中启动新的进程组?

应按预期工作。您确定子进程没有设置自己的PGID吗;或者甚至忽略SIGINT?ps显示他们都有相同的PGID吗?我敢肯定。ps节目。如果我在终端中执行命令,新进程的pid和pgid相同,所有子进程都将获得与新进程相同的pgid。当我在go中执行命令时,新进程及其子进程都具有终端会话的pgid。(在linux中,它的工作原理与预期一样)这些进程中是否有一个是在shell管道中启动的?听起来好像有其他东西在专门设置或更改pgid。您可以尝试设置
Setsid:true
以确保进程在新会话中启动。它使用
Setsid:true
正确设置进程组id,一切正常。我想这正是
Setpgid
应该做的。“我错了吗?”罗森克鲁兹我偶然发现了同样的问题。你找到解释了吗?