Go 过程不';在cmd.Process.Kill()调用后不会死亡
我有一个跟踪文件更改的程序,应该在文件更改时重新启动指定的进程 我使用Go 过程不';在cmd.Process.Kill()调用后不会死亡,go,Go,我有一个跟踪文件更改的程序,应该在文件更改时重新启动指定的进程 我使用cmd.Process.Kill()终止前一个进程,但调用Kill()后它仍保持活动状态 与“从项目开始”流程相关的一些代码: //ShellPlugin允许在任务运行程序中运行shell命令 类型ShellPlugin结构{ scope*scope.scope 参数 日志记录器 陈波先生 } //调用插件 func(p*ShellPlugin)调用(tx*job.RunContext,r plugins.JobRunner)
cmd.Process.Kill()
终止前一个进程,但调用Kill()
后它仍保持活动状态
与“从项目开始”流程相关的一些代码:
//ShellPlugin允许在任务运行程序中运行shell命令
类型ShellPlugin结构{
scope*scope.scope
参数
日志记录器
陈波先生
}
//调用插件
func(p*ShellPlugin)调用(tx*job.RunContext,r plugins.JobRunner)(错误){
延迟关闭(p.done)
//流程:/bin/sh-c ping google.com
cmd,err:=p.params.createProcess(p.scope)
如果错误!=零{
返回fmt.Errorf(“未能创建进程以执行命令“%s”:%s”,p.params.command,err)
}
p、 log.Debug(“命令:“%s”,p.params.command)
p、 log.Debug(`starting process“%s”…`,strings.Join(cmd.Args,”))
如果err=cmd.Start();err!=nil{
返回fmt.Errorf(`failed to execute command“%s”:%s`,strings.Join(cmd.Args,”),err)
}
go func(){
挑选{
病例问题是主进程sh
被杀死,但子进程睡眠
仍然活着
解决方案是将进程组分配给主进程,并杀死整个进程组
// assign process group
cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}
// Kill pg
syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
找到了解决方案