2016-06-13 75 views
1

我是新手,我有幾個小型服務正在運行。優雅地退出去應用程序

當我部署新版本時,通常只需上傳新的二進制文件kill現有的進程並啓動一個新的進程。

我想知道這是否是正確的做法,或者如果有更好的方法來做到這一點。

+1

你的目標是?你在做什麼沒有問題,對於Go程序和其他任何程序都沒有什麼不同。 – JimB

+0

@JimB我只是確保它確實沒問題。例如,我想象許多HTTP服務會在退出之前完成處理任何未完成的請求。 '殺死'感覺不對,但那可能只是我的缺乏經驗。 – Evert

+1

像其他人說的那樣,殺死並重新啓動並不罕見(在Go或其他地方)。有一些代碼可以避免在重新啓動時丟失連接:https://github.com/facebookgo/grace – twotwotwo

回答

3

殺死進程,替換和重新啓動沒有任何錯誤。如果你想要做一些清理在退出可能會做如下:

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功能終止之前。

+2

更好的方式無限制地阻止'main()':https://play.golang.org/p/X-6_qY810j。無論如何,無論如何都沒有理由在一個goroutine中觸發'gracefulShutdown()',並且這可以讓** main **成爲真正結束程序的人(這是應該發生的事)。而且,在你的版本中,永遠不需要通過'make'運行,因爲一個零通道無限期阻塞。因此'var forever chan int'避免了分配並且以相同的方式工作。 – Kaedys