我在本地构建了golang应用程序,然后在服务器上构建了scp
。我需要停止该过程并手动重新启动。二进制更新时有什么方法可以自动重启进程吗?Golang:如何在二进制更新时自动重启进程?
-1
A
回答
1
它需要成熟吗?您可以运行entr
并在二进制文件更改时触发更新程序脚本。
例如,
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)
所以,这种情况下适用。 (应用程序路径)目录中更改(应用程序文件名),然后用(参数)重新启动(应用程序完整路径)。
这个怎么样?
相关问题
- 1. 如何重新启动Node.js子进程
- 2. 如何在重新进入活动时重新启动CountDownTimer
- 3. 如何让子进程在父进程重新启动时死亡
- 4. 如何让PHP进程在死时自动重启?
- 5. 当进程仍在运行时,重新启动如何处理
- 6. 在启动时启动java进程并在死时自动重启
- 7. 在mod_wsgi守护进程'重新启动
- 8. 在Windows中重新启动进程[exe]
- 9. 如何启动第二个Java进程?
- 10. 如何更新二进制文件
- 11. 如何在GoLang程序中运行二进制文件?
- 12. 在python * nix系统中自动重新启动守护进程
- 13. Linux在崩溃时自动重新启动应用程序 - 守护进程
- 14. 何时在Erlang监督下重新启动进程?
- 15. 如何在新应用更新时强制重新启动AppStore
- 16. 如何在调试器启动时附加第二个进程?
- 17. 检查Golang中的二进制存在
- 18. 如何在Windows上自动捕获并重新启动崩溃的进程?
- 19. 守护进程如何在启动时自动运行
- 20. 使用grunt重新启动phantomjs进程
- 21. 重新启动进程脚本linux
- 22. 停止postgres进程重新启动 - mac
- 23. 通过Bash重新启动进程
- 24. 配置工头重新启动进程
- 25. 进度条重新启动
- 26. 在后台自动更新进程
- 27. 如何在进程崩溃后重新启动种子节点?
- 28. 如何阻止在Java子进程和重新启动它们
- 29. 为什么unicorn.pid被更新,但进程不会重新启动?
- 30. 如何在Windows中启动另一个进程时启动进程?
这可能有所帮助 - https://github.com/jpillora/overseer – Nadh
这个问题跟Go没有任何关系。 – seh
如果你正在执行scp,为什么不把它改成'''scp二进制服务器:/ bin && ssh server restart-server.sh'''? – placeybordeaux