2016-12-29 52 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) 

所以,这种情况下适用。 (应用程序路径)目录中更改(应用程序文件名),然后用(参数)重新启动(应用程序完整路径)。

这个怎么样?

相关问题