杀死子进程 - 执行。命令

如何杀死子进程?


我有一个长时间运行的应用程序,使用“exec.命令“:


// ...I am a long running application in the background


// Now I am starting a child process, that should be killed togeter with the parent application.

cmd := exec.Command("sh", "-c", execThis)


// create a new process group

// cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

现在,如果我杀死它就不会杀死子进程 - 你知道怎么做吗?<pid of long running application in the background>


慕标5832272
浏览 131回答 1
1回答

12345678_0001

这里有很多事情需要梳理。首先,这是操作系统本身的作用。然后,一旦我们知道操作系统是什么以及它做了什么,程序就会做什么。显然,操作系统的作用取决于操作系统。POSIX风格的操作系统有两种:普通和基于进程组的,或killpg。这个函数的 killpg 变体是唯一一个向整个进程组发送信号的函数;plain 只是向单个进程发送信号。killkillkillkill当程序从控制终端运行时,键盘信号(^C,^Z等)被发送到该控制终端的前台进程组(请参阅链接的页面以获取对这些信号的合理描述,并注意BSD / macOS也有^T和)。但是,如果信号是从其他程序发送的,而不是从控制终端发送的,则由该程序决定是否调用或 ,以及发送什么信号。SIGINFOkillpgkill某些信号无法捕获。SIGKILL和SIGSTOP就是这种情况。这些信号不应该随意发送;它们应该保留给最后的手段。相反,希望另一个程序停止的程序通常应该发送SIGINT,SIGTERM,SIGHUP或(很少)SIGQUIT中的一个。Go倾向于将SIGQUIT绑定到调试(因为POSIX系统上的运行时使^\转储各种goroutines的堆栈),因此这不是一个好的选择。但是,这不是由您在此处编写的Go程序决定的,该程序只能尝试捕获信号。发送内容的选择取决于发件人。捕捉信号的“Go方式”是使用goroutine和通道。信号。通知功能将操作系统级信号转换为通道上的事件。您不知道(也无法)知道的是信号是否通过或到达您的过程(尽管如果它来自控制终端交互,POSIX-y内核通过等效项发送)。如果要自行传播该信号,只需使用通知事件调用进行操作系统级调用的代码即可。使用&nbsp;os/exec&nbsp;包时,请使用&nbsp;cmd.Process.Signal:请注意,这会调用 POSIX ,而不是它的 ,但您不希望在此处使用,因为我们首先假设的是非进程组信号(基于 p 组的信号可能不需要传播)。killkillpgkillpgkillkillkillpgkillpg没有完全可移植的方式将信号发送到POSIX进程组(这并不奇怪,因为这不是可移植到非POSIX系统)。可悲的是,在Go中似乎没有直接的Unix或POSIX特定方法来做到这一点。在非POSIX系统上,一切都完全不同。请参阅操作系统/信号包前面的讨论。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go