2016-06-13 16 views
1

私は新しいです、私はいくつかの小さなサービスを実行している。正常にアプリケーションを終了する

私は新しいバージョンをデプロイするときに、通常は新しいバイナリファイルkillをアップロードして新しいプロセスを開始します。

これは正しいことか、これを行う良い方法があるかどうか疑問に思っています。

+1

あなたの目標は何ですか?あなたがやっていることに何も間違いはありません。Goプログラムと他のプログラムとではまったく異なるものはありません。 – JimB

+0

@JimB私はそれが実際に大丈夫であることを確認しています。例えば、多くのHTTPサービスが終了する前に、未処理のリクエストを処理すると思います。 '殺す'は間違っていると感じますが、それはちょうど私の経験不足かもしれません。 – Evert

+1

他の人が言ったように、kill-and-restartはあまり一般的ではありません(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

関連する問題