2017-10-09 8 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のようなものでプロセスを管理しているのであれば、stop(たぶんSIGTERM)で呼び出されたときにinit.dスクリプトが何を送信しても、あなたはそれを捕まえることができますが、それが呼び出され、マシンが完全にシャットダウンしたときです。 1秒か2秒以上かかる処理は時間通りに終了しない可能性があります。マシンがシャットダウンする前に何かが完了したことを確認したい場合は、シャットダウン時に待機するのではなく、定期的に実行する必要があります。

関連する問題