3 回答
TA贡献1744条经验 获得超4个赞
确保子进程被杀死的唯一方法,是在同一个进程组中启动它,并将进程组作为一个整体杀死,或者Pdeadthsig在syscall.SetProcAddr.
您可以为SIG_INTand等常见信号设置信号处理程序SIG_TERM,并在退出之前终止您的子进程,但由于您无法捕获SIG_KILL,因此通常不值得付出努力。
请参阅:其他 goroutine 中的恐慌没有停止子进程
cmd := exec.Command("./long-process")
cmd.SysProcAttr = &syscall.SysProcAttr{
Pdeathsig: syscall.SIGTERM,
}
TA贡献1898条经验 获得超8个赞
一种可能的策略是将正在运行的进程列表保存在全局数组中,var childProcesses = make([]*os.Process, 0)并在每次启动进程时附加到该列表中。
有自己的Exit功能。确保您永远不会os.Exit在代码中的任何地方调用,Exit而是始终调用您自己的函数。您的退出功能将杀死所有childProcesses
for _, p := range childProcesses {
p.Kill()
}
处理信号,使它们通过您自己的退出函数,例如在初始化期间执行此操作(靠近主函数顶部的某个位置)
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT)
goUnsafe(func() {
var signal = <-sigs
log.Println("Got Signal", signal)
Exit(0)
})
TA贡献1853条经验 获得超6个赞
我在 Go (golang) 中有一些代码,有几个不同的线程运行一个单独的可执行文件。我想确保如果用户在 Go 中杀死我的进程,我有办法杀死我调用的可执行文件,有没有办法做到这一点?
我不清楚您所说的“运行不同的线程”是什么意思。我会假设:
这些线程属于“我调用的可执行文件”
那些线程不一定是用 golang 写的
您无法控制它们的执行(即,您无法更改它们的代码)
从这个意义上说,我们正在谈论创建一个进程组并确保当您杀死一个进程时,该组中的所有其他进程也必须停止。此机制依赖于操作系统。
在当前版本中,有两种可能性(参见包x/sys):
Unix:即将
setpgid(2)
视窗:快到了
CreateProcess
。请参阅MS Windows 文档 CreateProcess。你必须通过CREATE_NEW_PROCESS_GROUP
旗帜(见)
- 3 回答
- 0 关注
- 197 浏览
添加回答
举报