2016-12-29 50 views
-1

我在本地構建了golang應用程序,然後在服務器上構建了scp。我需要停止該過程並手動重新啓動。二進制更新時有什麼方法可以自動重啓進程嗎?Golang:如何在二進制更新時自動重啓進程?

+0

這可能有所幫助 - https://github.com/jpillora/overseer – Nadh

+0

這個問題跟Go沒有任何關係。 – seh

+0

如果你正在執行scp,爲什麼不把它改成'''scp二進制服務器:/ bin && ssh server restart-server.sh'''? – placeybordeaux

回答

1

它需要成熟嗎?您可以運行entr並在二進制文件更改時觸發更新程序腳本。

http://entrproject.org/

例如,

echo 'binary_path' | entr script.sh & 
3

雖然這是一般最好能夠使用類似的daemontools或類似的關閉過程中實現的,還有當你想/需要你的程序內部做了一些情況。

做它你的程序中可以根據程序特性,如連接或文件可能已經打開,等

話雖如此,在這裏你有這將在大多數情況下的實現會非常棘手:

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) 

所以,這種情況下適用。 (應用程序路徑)目錄中更改(應用程序文件名),然後用(參數)重新啓動(應用程序完整路徑)。

這個怎麼樣?

相關問題