为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
潇湘沐 2021-12-07 10:07:13
我在 Go (golang) 中有一些代码,有几个不同的线程运行一个单独的可执行文件。我想确保如果用户在 Go 中杀死我的进程,我有办法杀死我调用的可执行文件,有没有办法做到这一点?
查看完整描述

3 回答

?
慕无忌1623718

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,

}


查看完整回答
反对 回复 2021-12-07
?
汪汪一只猫

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)

})


查看完整回答
反对 回复 2021-12-07
?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

我不清楚您所说的“运行不同的线程”是什么意思。我会假设:

  • 这些线程属于“我调用的可执行文件”

  • 那些线程不一定是用 golang 写的

  • 您无法控制它们的执行(即,您无法更改它们的代码)

从这个意义上说,我们正在谈论创建一个进程组并确保当您杀死一个进程时,该组中的所有其他进程也必须停止。此机制依赖于操作系统。

在当前版本中,有两种可能性(参见包x/sys):


查看完整回答
反对 回复 2021-12-07
  • 3 回答
  • 0 关注
  • 197 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信