子进程接收 SIGINT,该 SIGINT 应仅由父进程处理,从而导致子进程突然终止

我正在尝试使用stdpipes在golang中管理应用程序(需要通过某个过程关闭,在这种情况下可以拯救世界)。
这是我试图实现的目标的一个简单示例,但我有一个问题对我来说非常具体,但对其他人来说也可能很有趣(也许你可以建议如何推广它)。

我还添加了一个名为的函数,该函数创建一个goroutine,并在发送终止信号时管理程序的停止。interruptListener

脚本的正常功能

  • 启动我的世界服务器

  • 等待 40 秒,然后通过 std 发出“stop”命令
    (在本例中,它按预期打印有关保存过程的所有日志)

测试用例(用于演示问题出在哪里):

  • 启动我的世界服务器

  • 在脚本发出停止命令之前,用户发送ctrl+ c
    (在这种情况下,它应该完成有关保存过程的日志,然后退出,但它没有......似乎在收到终止信号后返回假,所以它只是退出)scanner.Scan()

您知道为什么会发生这种情况吗?我应该研究什么才能找到解决方案?

我真的很迷茫,我已经花了8个多小时与所有可能的代码组合...


GCT1015
浏览 89回答 2
2回答

跃然一笑

感谢在评论中回答的人,这是一个可以接受的解决方案(仍然不完美,如评论中所解释的那样)只需在执行之前添加以下几行:cmd.Start()    // launch as new process group so that signals (ex: SIGINT) are not sent also the the child process    cmd.SysProcAttr = &syscall.SysProcAttr{        CreationFlags: syscall.CREATE_NEW_PROCESS_GROUP, // windows        // Setpgid: true, // linux    }

紫衣仙女

以下是对您的问题的更完整答案 - 杀死一个孩子的过程及其在Go中的所有孩子
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go