【问题标题】:can't catch SIGTERM sent by upstart in golang无法捕获 golang 中暴发户发送的 SIGTERM
【发布时间】:2015-08-24 10:07:53
【问题描述】:

我有一个新贵的工作正在运行(某种 TCP 服务器)。有时我的进程会重新启动,我可以在系统日志中看到下一行:

kernel: [2422352.460162] init: <job_name> main process (16545) killed by TERM signal

我不明白内核发出这个 TERM 信号的原因,所以我决定在终止之前捕获这个信号并打印一些内存和 goroutines 统计信息。
所以现在我的代码看起来像这样:

func main() {
   sigc := make(chan os.Signal, 1)
   signal.Notify(sigc, syscall.SIGTERM)
   go func() {
      s := <-sigc
      numOfGoRoutines := runtime. NumGoroutine()
      var stats runtime.MemStats
      runtime.ReadMemStats(&stats)
      log.Println("Got Signal ", s)
      log.Println("num of goroutines: ", numOfGoRoutines)
      log.Println("Memory Allocated: ",  stats.Alloc)
      os.Exit(1)
   }()
   someInfiniteLoopFunction() // this function defined in a different file.

现在奇怪的是,即使我手动停止作业,我的 goroutine 也没有捕捉到 TERM 信号。
更有趣的是,如果我在信号处理程序 goroutine 之后立即添加一个睡眠 100 秒并在此睡眠期间停止作业,那么我的 goroutine 确实捕获了 TERM 信号。
我在这里绝对一无所知,并会感谢任何帮助。

【问题讨论】:

  • 您确定您没有捕捉到TERM 信号吗?也许输出正在被暴发户丢弃。尝试登录到文件。
  • @JimB 伙计,你是对的!我设法写入文件。为什么暴发户放弃输出?谢谢!
  • Upstart 的 wait 调用可能会在输出缓冲某处并被丢弃时返回。短暂的睡眠可能会有所帮助,但没有办法让它万无一失。

标签: linux ubuntu go signals


【解决方案1】:

UPD。对不起,我现在没看错。也许你的 goroutine 不要等待信号并执行os.Exit()。尝试添加另一个频道。

func main() {
   sigc := make(chan os.Signal, 1)
   done := make(chan bool, 1)
   signal.Notify(sigc, syscall.SIGTERM)
   go func() {

      s := <-sigc
      numOfGoRoutines := runtime. NumGoroutine()
      var stats runtime.MemStats
      runtime.ReadMemStats(&stats)
      log.Println("Got Signal ", s)
      log.Println("num of goroutines: ", numOfGoRoutines)
      log.Println("Memory Allocated: ",  stats.Alloc)
      done <- true
      os.Exit(1)
   }()
   <-done
   someInfiniteLoopFunction() // this function defined in a different file.

【讨论】:

  • 您好,您能详细说明一下吗?如果我添加这个 defer 会有什么不同?
  • 这与恐慌无关
  • @JimB 有什么建议吗?
  • @makhov 但为什么不等待呢?另外,正如我所提到的,如果我在 goroutine 之后添加一个 sleep 并调用 stop,我确实可以捕捉到信号。
  • 这仍然没有做任何事情,因为你永远无法进入主循环。
猜你喜欢
  • 2010-11-16
  • 2019-11-06
  • 2018-12-12
  • 2021-02-07
  • 2015-05-19
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-24
相关资源
最近更新 更多