我在本地構建了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