我是新手,我有幾個小型服務正在運行。優雅地退出去應用程序
當我部署新版本時,通常只需上傳新的二進制文件kill
現有的進程並啓動一個新的進程。
我想知道這是否是正確的做法,或者如果有更好的方法來做到這一點。
我是新手,我有幾個小型服務正在運行。優雅地退出去應用程序
當我部署新版本時,通常只需上傳新的二進制文件kill
現有的進程並啓動一個新的進程。
我想知道這是否是正確的做法,或者如果有更好的方法來做到這一點。
殺死進程,替換和重新啓動沒有任何錯誤。如果你想要做一些清理在退出可能會做如下:
import(
"fmt"
"os"
"os/signal"
"syscall"
)
func main(){
//work here
go gracefulShutdown()
forever := make(chan int)
<-forever
}
func gracefulShutdown() {
s := make(chan os.Signal, 1)
signal.Notify(s, os.Interrupt)
signal.Notify(s, syscall.SIGTERM)
go func() {
<-s
fmt.Println("Sutting down gracefully.")
// clean up here
os.Exit(0)
}()
}
如果你殺了{} PID(無-9開關),進程將調用gracefullShutdown
功能終止之前。
更好的方式無限制地阻止'main()':https://play.golang.org/p/X-6_qY810j。無論如何,無論如何都沒有理由在一個goroutine中觸發'gracefulShutdown()',並且這可以讓** main **成爲真正結束程序的人(這是應該發生的事)。而且,在你的版本中,永遠不需要通過'make'運行,因爲一個零通道無限期阻塞。因此'var forever chan int'避免了分配並且以相同的方式工作。 – Kaedys
你的目標是?你在做什麼沒有問題,對於Go程序和其他任何程序都沒有什麼不同。 – JimB
@JimB我只是確保它確實沒問題。例如,我想象許多HTTP服務會在退出之前完成處理任何未完成的請求。 '殺死'感覺不對,但那可能只是我的缺乏經驗。 – Evert
像其他人說的那樣,殺死並重新啓動並不罕見(在Go或其他地方)。有一些代碼可以避免在重新啓動時丟失連接:https://github.com/facebookgo/grace – twotwotwo