2016-12-29 14 views
-1

ローカルにgolangアプリを構築してからサーバーにscpをインストールしました。私はプロセスを停止し、手動で再起動する必要があります。バイナリが更新されたときにプロセスを自動再起動する方法はありますか?Golang:バイナリの更新時にプロセスを自動再起動する方法は?

+0

これは助けになるかもしれません - https://github.com/jpillora/overseer – Nadh

+0

この質問はGoとは関係ありません。 – seh

+0

scpを実行している場合は、それを '' 'scp binary server:/ bin && ssh server restart-server.sh'''に変更してください。 – placeybordeaux

答えて

1

洗練されている必要がありますか?バイナリが変更されると、entrが実行され、アップデータスクリプトがトリガされます。

http://entrproject.org/

例えばこれはdaemontoolsのか、似たようなものを使用してオフプロセスに実装することが一般的に優れているものの

echo 'binary_path' | entr script.sh & 
3

、あなたが/欲しい、それはあなたのプログラムの内部で行われる必要がある場合があります。

あなたのプログラム内でそれを行うと、このような接続やファイルなどのプログラムの特性に応じて、それが開いていることがあり注意が必要です、など

は、ここにあなたがほとんどのケースでうまくいくの実装を持っていることを言った:

package main 

import (
    "log" 
    "os" 
    "syscall" 
    "time" 

    "github.com/fsnotify/fsnotify" 
    "github.com/kardianos/osext" 
) 

func setupWatcher() (chan struct{}, error) { 
    file, err := osext.Executable() 
    if err != nil { 
     return nil, err 
    } 
    log.Printf("watching %q\n", file) 
    w, err := fsnotify.NewWatcher() 
    if err != nil { 
     return nil, err 
    } 
    done := make(chan struct{}) 
    go func() { 
     for { 
      select { 
      case e := <-w.Events: 
       log.Printf("watcher received: %+v", e) 
       err := syscall.Exec(file, os.Args, os.Environ()) 
       if err != nil { 
        log.Fatal(err) 
       } 
      case err := <-w.Errors: 
       log.Printf("watcher error: %+v", err) 
      case <-done: 
       log.Print("watcher shutting down") 
       return 
      } 
     } 
    }() 
    err = w.Add(file) 
    if err != nil { 
     return nil, err 
    } 
    return done, nil 
} 

func main() { 
    log.Print("program starting") 
    watcher, err := setupWatcher() 
    if err != nil { 
     // do something sensible 
     log.Fatal(err) 
    } 
    // continue with app startup 
    time.Sleep(100 * time.Minute) // just for testing 
    // eventually you may need to end the watcher 
    close(watcher) // this way you can 
} 

次に、あなたは

% go build main.go  
% ./main 
2016/12/29 14:15:06 program starting 
2016/12/29 14:15:06 watching "/home/plalloni/tmp/v/main" 

そして、ここで(他の端末で)それはあなたが実行した後に生成される出力いくつかの連続は、「ビルド舞を行ってくださいn.go "(実行中のバイナリを更新します)。

2016/12/29 14:15:32 watcher received: "/home/plalloni/tmp/v/main": CHMOD 
2016/12/29 14:15:32 program starting 
2016/12/29 14:15:32 watching "/home/plalloni/tmp/v/main" 
2016/12/29 14:15:38 watcher received: "/home/plalloni/tmp/v/main": CHMOD 
2016/12/29 14:15:38 program starting 
2016/12/29 14:15:38 watching "/home/plalloni/tmp/v/main" 

希望します。

1

このケースについては解決方法があります。

も参照してください。 https://github.com/narita-takeru/cmdrevive

cmdrevive ./htmls/ ".html$" (application) (arguments) 

ので、この場合に適用。

cmdrevive "/(app path)" "(app filename)" (app full path) (arguments) 

(アプリパス)ディレクトリに変更(アプリのファイル名)場合、(引数)と(アプリフルパス)を再起動します。

これはどうですか。

関連する問題