我在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(),这会执行一些清理,但我无法实现所需的行为。
有人可以指导我如何实现这一目标?
答案 0 :(得分:1)
正如JimB所说,并且根据the documentation,您无法处理SIGKILL或SIGSTOP。这些很可能是在关机时发送的。如果您使用init.d之类的东西来管理进程,那么当您使用stop
(可能是SIGTERM)调用init.d脚本时,您可能会收到它们发送的任何内容,但您可以捕获它。调用它和机器完全关闭之间的时间有限。任何花费超过一秒或两秒的处理都不可能及时完成。如果你想确保在机器关闭之前完成某些事情,你应该定期做,而不是等到关机时这样做。