Golang如何創(chuàng)建守護進程以及平滑重啟

這篇文章主要介紹了Golang如何創(chuàng)建守護進程以及平滑重啟,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

10年積累的成都網(wǎng)站制作、做網(wǎng)站、外貿(mào)營銷網(wǎng)站建設經(jīng)驗,可以快速應對客戶對網(wǎng)站的新想法和需求。提供各種問題對應的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡服務。我雖然不認識你,你也不認識我。但先網(wǎng)站設計后付款的網(wǎng)站建設流程,更有萬秀免費網(wǎng)站建設讓你可以放心的選擇與我們合作。

方法如下

1)生成守護進程

直接上代碼:

package main

import (
    "os"
    "os/exec"
    "path/filepath"
)

func main() {
    //判 斷當其是否是子進程,當父進程return之后,子進程會被 系統(tǒng)1 號進程接管
    if os.Getppid() != 1 {
        // 將命令行參數(shù)中執(zhí)行文件路徑轉換成可用路徑
        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() // 開始執(zhí)行新進程,不等待新進程退出
        return
    }
}

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

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

比如:

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

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

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

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

任何進程在運行中都能接收到我們發(fā)送給它的信號。關于 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)處理信號。

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

golang的優(yōu)點

golang是一種編譯語言,可以將代碼編譯為機器代碼,編譯后的二進制文件可以直接部署到目標機器而無需額外的依賴,所以golang的性能優(yōu)于其他的解釋性語言,且可以在golang中使用goroutine來實現(xiàn)并發(fā)性,它提供了一個非常優(yōu)雅的goroutine調度程序系統(tǒng),可以很容易地生成數(shù)百萬個goroutine。

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Golang如何創(chuàng)建守護進程以及平滑重啟”這篇文章對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關知識等著你來學習!

網(wǎng)頁名稱:Golang如何創(chuàng)建守護進程以及平滑重啟
當前URL:http://bm7419.com/article22/pccccc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供微信小程序、服務器托管、面包屑導航、移動網(wǎng)站建設、品牌網(wǎng)站制作標簽優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名