gpt4 book ai didi

戈朗 : How to auto-restart process when binary updated?

转载 作者:IT王子 更新时间:2023-10-29 02:26:27 24 4
gpt4 key购买 nike

我在本地构建了 golang 应用程序,然后 scp 到服务器。我需要停止该过程并手动重新启动。有什么方法可以在更新二进制文件时自动重启进程?

最佳答案

虽然这通常最好使用 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"

这是在您(在其他终端中)运行一些连续的“go build main.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"

希望对您有所帮助。

关于戈朗 : How to auto-restart process when binary updated?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41376092/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com