【问题标题】:Capturing kill code of go process?捕获go进程的终止代码?
【发布时间】:2014-11-19 14:49:20
【问题描述】:

我正在尝试编写一个测试来驱动 kill 命令的功能。为此,我需要我的测试目标(一个非常简单的 go http 服务器 - https://github.com/jadekler/git-grunt-gostop/blob/master/test/fixtures/gostop_basic.go)来区分使用 -2 和 -9 进行的杀戮。有没有办法做到这一点?似乎无论 -2 还是 -9,go 的延迟都不会发生,这是我的第一次尝试。随后的研究没有得到启发。

感谢您的任何建议!

【问题讨论】:

  • 您是否自己启动了进程,并且想要导致它退出的信号;还是您尝试使用 signal 包处理信号?
  • 嘿 - 感谢您的回复。是的,我自己开始了这个过程,现在我只是想运行kill -2 <pid> 来查看一些结果。编辑:但是,这样做的目的是让外部 javascript 进程启动它,而另一个进程将停止它。 AKA 我无法查看产生该过程的事物的退出代码。 ://
  • 嗯,非子进程不能wait,所以无法直接获取退出状态。如果你真的需要退出状态,你需要自己启动它,或者让实际的父进程以某种方式传达它。
  • 请注意,您不能捕获 SIGKILL (9):它会导致进程终止,没有机会进行任何特殊处理。

标签: unix go kill


【解决方案1】:

您可以使用os/signal package 捕获信号。您可以使用如下代码捕获SIGINT

import (
    "os"
    "os/signal"
)
...

// the signal module will lose notifications if the channel is not ready to receive, so give it a buffer
ch := make(chan os.Signal, 5)
go func() {
    for sig := range ch {
        // interrupt signal received
        os.Exit(0)
    }
}()
signal.Notify(ch, os.SIGINT)

很遗憾,您不能对SIGKILL 做同样的事情。来自signal(7) 手册页:

信号SIGKILLSIGSTOP 不能被捕获、阻止或忽略。

【讨论】:

  • 啊!这看起来很有希望。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多