有什麼辦法可以退出Go程序,但執行所有掛起的延遲語句嗎?清除臨時文件的最佳方法
我一直在使用延遲清理臨時文件,但當程序被Ctrl + C或os.Exit中斷時,延遲語句不會被執行。
退出該程序用Ctrl + C,二者foo.txt的和跳回到bar.txt之後遺留:
package main
import (
"fmt"
"io/ioutil"
"os"
"os/signal"
"syscall"
)
func main() {
ioutil.WriteFile("./foo.txt", []byte("foo"), 0644)
defer os.RemoveAll("./foo.txt")
go func() {
ioutil.WriteFile("./bar.txt", []byte("bar"), 0644)
defer os.RemoveAll("./bar.txt")
for {
// various long running things
}
}()
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
signal.Notify(c, syscall.SIGTERM)
go func() {
<-c
fmt.Println("Received OS interrupt - exiting.")
os.Exit(0)
}()
for {
// various long running things
}
}
不,但你可以重構你的代碼,所以它可以優雅地關閉,然後推遲執行。我建議在main的頂部聲明'c'並將它傳遞給go例程。在for循環中,你需要一個select語句來監聽'c',如果你得到一個信號,就停止你正在做的事情並返回。然後你不需要使用'os.Exit'來殺死你的goroutines(因爲你從來不應該這麼做),你的程序可以正常返回,從而允許你的被攻擊的os.RemoveAll進行清理。 – evanmcdonnal