2017-10-09 75 views
0

我在EC2的golang中有一個程序。Golang SIGTEM SIGKILL回調在停止EC2時沒有得到執行

的要求是對EC2終止執行清理。我試圖通過下面的代碼中,我已經創建了一個信道聽OS信號來實現這一點:

func InitTermination(){ 
    signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGKILL) //listen to termination signals (ctrl+c) 
    go func() { 
     <-c 
     log.Println("Calling uploadLogFiles on system/program termination") 
     *termination = true 
     for { 
      if !(*lock) { 
       err := uploadCompletedLogs() 
       if err != nil { 
        log.Fatalf("Error: %v", err) 
       } 
       break 
      } else { 
       time.Sleep(100 * time.Millisecond) 
      } 
     } 
     if !(os.Getenv("TEST") == "true") { 
      os.Exit(1) 
     } 
    }() 
} 

在實例終止或停止我想方法uploadCompletedLogs()要被執行,它執行一些清理,但我無法達到理想的行爲。

有人能指導我如何才能做到這一點?

+3

您無法處理SIGKILL。 – JimB

回答

1

由於JimB指出,每the documentation,你不能處理SIGKILL或SIGSTOP。這些可能是在關機時發送的。如果你使用類似init.d的方式來管理進程,你可能會得到任何你的init.d腳本發送時用stop(可能是SIGTERM)發送的信息,你可能會發現它,但是你的時間非常有限這是所謂的,當機器完全關閉。任何需要超過一秒鐘或兩秒鐘的處理都不可能及時完成。如果你想確保在機器關閉之前完成某些工作,你應該定期做,而不是在關機時等待。