Golang SIGTEM SIGKILL回调没有在停止EC2时执行

时间:2017-10-09 10:54:15

标签: amazon-web-services go amazon-ec2 aws-sdk

我在EC2的golang中有一个程序。

要求是对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(),这会执行一些清理,但我无法实现所需的行为。

有人可以指导我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

正如JimB所说,并且根据the documentation,您无法处理SIGKILL或SIGSTOP。这些很可能是在关机时发送的。如果您使用init.d之类的东西来管理进程,那么当您使用stop(可能是SIGTERM)调用init.d脚本时,您可能会收到它们发送的任何内容,但您可以捕获它。调用它和机器完全关闭之间的时间有限。任何花费超过一秒或两秒的处理都不可能及时完成。如果你想确保在机器关闭之前完成某些事情,你应该定期做,而不是等到关机时这样做。