站長資訊網
最全最豐富的資訊網站

Golang如何創建守護進程以及平滑重啟

下面由golang教程欄目給大家介紹Golang如何創建守護進程以及平滑重啟,希望對需要的朋友有所幫助!

Golang如何創建守護進程以及平滑重啟

作為一名 PHP 開發老兵。使用過命令行對 nginx、PHP-FPM 進行啟動/重啟/停止等操作。印象非常深刻。讓我用 C/C++ 開發這樣的系統肯定是沒精力搞了。然而,自從 Golang 進入了我的視野之后。我發現這一切都變得非常的容易。

1)生成守護進程

直接上代碼:

package main  import (     "os"     "os/exec"     "path/filepath" )  func main() {     //判 斷當其是否是子進程,當父進程return之后,子進程會被 系統1 號進程接管     if os.Getppid() != 1 {         // 將命令行參數中執行文件路徑轉換成可用路徑         filePath, _ := filepath.Abs(os.Args[0])         cmd := exec.Command(filePath, os.Args[1:]...)         // 將其他命令傳入生成出的進程         cmd.Stdin = os.Stdin // 給新進程設置文件描述符,可以重定向到文件中         cmd.Stdout = os.Stdout         cmd.Stderr = os.Stderr         cmd.Start() // 開始執行新進程,不等待新進程退出         return     } }

對 Linux 系統熟悉的人應該知道:用戶創建的守護進程會被 Linux 系統的 1 號進程接管。換句話說,上面的代碼只能在 Linux 系統運行。Unix 系統我沒有玩過。所以,也不能給出具體的建議。

我在網上看到還有其他的方法實現守護進程的創建。但是,我覺得只有上面源碼的方式我覺得不錯。并且成功用于項目當中。

比如:

os.StartProcess() 創建守護進程。 syscall.RawSyscall() 創建守護進程。

唯獨 exec.Command 創建守護進程的方式最高級。封裝得最好。推薦使用這種試。

2) 守護進程啟動/重啟/停止

在第 1 點當中,我們已經成功啟動了一個守護進程。但是,我們不可能使用 kill 命令去結束它。然后,再啟動吧。所以,我們要用業界專業的手法:信號。

任何進程在運行中都能接收到我們發送給它的信號。關于 Linux 的信號有很多。大家可以自己 Google 搜索關鍵詞:Linux 信號。

直接上源碼:

package main  import "fmt" import "os" import "os/signal" import "syscall"  func main() {      // Go signal notification works by sending `os.Signal`     // values on a channel. We'll create a channel to     // receive these notifications (we'll also make one to     // notify us when the program can exit).     sigs := make(chan os.Signal, 1)     done := make(chan bool, 1)      // `signal.Notify` registers the given channel to     // receive notifications of the specified signals.     signal.Notify(sigs, syscall.SIGINT, syscall.SIGTERM)      // This goroutine executes a blocking receive for     // signals. When it gets one it'll print it out     // and then notify the program that it can finish.     go func() {         sig := <-sigs         fmt.Println()         fmt.Println(sig)         done <- true     }()      // The program will wait here until it gets the     // expected signal (as indicated by the goroutine     // above sending a value on `done`) and then exit.     fmt.Println("awaiting signal")     <-done     fmt.Println("exiting") }

有三個關鍵點:
1)注冊信號
2)接收信號
3)處理信號。

只要把創建守護進程與信號量處理整合一起,就能實現命令去管理守護進程了。

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久久精品国产sm调教网站 | 日韩精品电影一区亚洲| 国内一级特黄女人精品毛片| 91精品国产91久久久久久| 久久精品*5在热| 中文精品字幕电影在线播放视频 | 国产极品白嫩精品| 国产精品内射婷婷一级二| 香港黄页精品视频在线| 亚洲日韩av无码| 国产成人啪精品视频免费网| 成人h动漫精品一区二区无码 | 一区二区日韩国产精品| 日韩精品少妇无码受不了| 国产精品久久香蕉免费播放| 精品韩国亚洲av无码不卡区| 亚洲国产成人久久精品软件| 2021国产成人精品国产| 精品国产sm捆绑最大网免费站 | 国产精品哟哟视频| 精品国产一区二区三区久久影院| 亚洲AV永久无码精品一福利| 无码专区人妻系列日韩精品少妇| 99精品国产一区二区三区2021| 精品不卡一区二区| 国产精品电影在线观看| 精品久久久无码21p发布| 精品国产天线2019| 国产精品亚洲片夜色在线| 精品国产V无码大片在线看| 国产a视频精品免费观看| 精品无码免费专区毛片| 国产精品三级视频| 国产精品久久久久蜜芽| 一本精品中文字幕在线| 久久精品国产72国产精| 孩交精品xxxx视频视频| 日韩精品视频观看| 国产av无码久久精品| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲综合精品伊人久久|