猿问

确保 Go Process 中调用的可执行文件在 Process 被杀死时被杀死

我在 Go (golang) 中有一些代码,有几个不同的线程运行一个单独的可执行文件。我想确保如果用户在 Go 中杀死我的进程,我有办法杀死我调用的可执行文件,有没有办法做到这一点?


潇湘沐
浏览 198回答 3
3回答

慕无忌1623718

确保子进程被杀死的唯一方法,是在同一个进程组中启动它,并将进程组作为一个整体杀死,或者Pdeadthsig在syscall.SetProcAddr.您可以为SIG_INTand等常见信号设置信号处理程序SIG_TERM,并在退出之前终止您的子进程,但由于您无法捕获SIG_KILL,因此通常不值得付出努力。请参阅:其他 goroutine 中的恐慌没有停止子进程cmd := exec.Command("./long-process")cmd.SysProcAttr = &syscall.SysProcAttr{    Pdeathsig: syscall.SIGTERM,}

汪汪一只猫

一种可能的策略是将正在运行的进程列表保存在全局数组中,var childProcesses = make([]*os.Process, 0)并在每次启动进程时附加到该列表中。有自己的Exit功能。确保您永远不会os.Exit在代码中的任何地方调用,Exit而是始终调用您自己的函数。您的退出功能将杀死所有childProcessesfor _, p := range childProcesses {&nbsp; &nbsp; p.Kill()}处理信号,使它们通过您自己的退出函数,例如在初始化期间执行此操作(靠近主函数顶部的某个位置)sigs := make(chan os.Signal, 1)signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM, syscall.SIGKILL, syscall.SIGQUIT)goUnsafe(func() {&nbsp; &nbsp; var signal = <-sigs&nbsp; &nbsp; log.Println("Got Signal", signal)&nbsp; &nbsp; Exit(0)})

墨色风雨

我在 Go (golang) 中有一些代码,有几个不同的线程运行一个单独的可执行文件。我想确保如果用户在 Go 中杀死我的进程,我有办法杀死我调用的可执行文件,有没有办法做到这一点?我不清楚您所说的“运行不同的线程”是什么意思。我会假设:这些线程属于“我调用的可执行文件”那些线程不一定是用 golang 写的您无法控制它们的执行(即,您无法更改它们的代码)从这个意义上说,我们正在谈论创建一个进程组并确保当您杀死一个进程时,该组中的所有其他进程也必须停止。此机制依赖于操作系统。在当前版本中,有两种可能性(参见包x/sys):Unix:即将setpgid(2)视窗:快到了CreateProcess。请参阅MS Windows 文档 CreateProcess。你必须通过CREATE_NEW_PROCESS_GROUP旗帜(见)
随时随地看视频慕课网APP

相关分类

Go
我要回答