最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

golang進程啟動及監(jiān)控方式

 更新時間:2026年04月27日 09:09:38   作者:壹零空間  
本文介紹了使用Golang實現(xiàn)進程守護和進程監(jiān)控的方法,提供了兩種具體實現(xiàn)方式:一種是代碼集成到業(yè)務代碼中,通過命令行參數(shù)判斷是否啟動守護進程;另一種是單獨編寫守護進程程序,不與業(yè)務代碼耦合,可作為通用的守護進程程序,兩種方式各有優(yōu)缺點,適用于不同的場景

golang進程啟動及監(jiān)控

  • 守護進程(deamon):為任意進程創(chuàng)建守護進程,使進程脫離終端運行
  • 監(jiān)控進程(forever):創(chuàng)建監(jiān)控重啟進程,使進程被殺死后能夠重啟

由于近期項目需要,使用go預研開發(fā)邊緣智能程序,因此就想著通過golang實現(xiàn)進程守護及進程監(jiān)控的功能,在golang程序中啟動子進程,有很好的封裝exec.Command,導入包為os/exec,本文主要以此種方式實現(xiàn),包含以下兩種實現(xiàn)方式。

1.1 以集成到業(yè)務代碼的方式實現(xiàn)

此方式是把相關代碼集成到我們需要監(jiān)控的進程代碼中,通過命令行參數(shù)來判斷是否啟用守護進程,其代碼如下所示:

test.go

package test

import (
 "flag"
 "fmt"
 "os"
 "os/exec"
 "time"
)
func main() {
 daemon := flag.Bool("deamon", false, "run in daemon and forever")
 flag.Parse()
 //判斷是否以守護進程的方式啟動
 if *daemon {
  runbydeamon(os.Args) //執(zhí)行deamon,由其啟動主程序
 }
 //業(yè)務主程序代碼
 fmt.Println("start test Service")
}

//以deamon的方式啟動程序,并監(jiān)控進程
func runbydeamon(args []string) {
 fmt.Printf("PID: %d PPID: %d ARG: %s\n", os.Getpid(), os.Getppid(), os.Args)
 //去掉-deamon運行參數(shù),啟動主程序
 for i := 0; i < len(args); {
  if args[i] == "-deamon" && i != len(args)-1 {
   args = append(args[:i], args[i+1:]...)
  } else if args[i] == "-deamon" && i == len(args)-1 {
   args = args[:i]
  } else {
   i++
  }
 }
 //啟動子進程,去掉-deamon參數(shù)后,執(zhí)行程序,由于子程序無deamon參數(shù),因此會直接執(zhí)行業(yè)務代碼
 for {
  cmd := exec.Command(args[0], args[1:]...)
  cmd.Stdin = os.Stdin
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  err := cmd.Start()//開啟子進程
  if err != nil {
   fmt.Fprintf(os.Stderr, "start oasis erir [-] Error: %s\n", err)
   return
  }
  fmt.Println("run oasis bydeamon,pid=", cmd.Process.Pid, ",ppid=", os.Getpid(), "args=", args, "time=", time.Now())
  cmd.Wait() //阻塞等待進程退出
 }
}

通過go buid編寫以后,執(zhí)行"test -deamon"后,由于帶有代碼會啟動兩個test進程,第一次啟動時由于帶有參數(shù)"-deamon",因此會調(diào)用runbydeamon,此函數(shù)會去掉-deamon參數(shù),再次以子進程的方式執(zhí)行"test",通過cmd.start()啟動子進程,子進程由于不帶"-deamon",會直接進入業(yè)務代碼實現(xiàn),這里會打?。?/p>

start test Service,守護進程有一個for循環(huán),一直在等待子進程退出,如果子進程異常退出,守護進程會再次把子進程進程拉起來并等待。

1.2 以單獨代碼的方式實現(xiàn)

上文實現(xiàn)方式,與業(yè)務代碼耦合,啟動時只需要帶有一個參數(shù)即可啟動守護進程和業(yè)務進程,啟動比較簡單,但是代碼與業(yè)務耦合在一起,這種寫法使得沒法復用守護進程,其實守護進程與業(yè)務進程沒有任何關系,大可提取出來,作為通用的守護進程程序,支持任務進程的后臺啟動和監(jiān)控,代碼如下:

deamon.go

package deamon

import (
 "flag"
 "fmt"
 "os"
 "os/exec"
 "time"
)
func main() {
 pcmd := flag.String("cmd", "", "run cmd in daemon and forever")
 flag.Parse()
 runbydeamon(*pcmd) //執(zhí)行deamon,由其啟動主程序
}

//以deamon的方式啟動程序,并監(jiān)控進程
func runbydeamon(args string) {
 fmt.Printf("PID: %d PPID: %d ARG: %s\n", os.Getpid(), os.Getppid(), os.Args)
 if cmd==""{
    fmt.Println("cmd is null")
    os.Exit(0)
 }
 //啟動子進程,既是去掉-deamon參數(shù)后,執(zhí)行程序,由于子程序無deamon參數(shù),因此會直接執(zhí)行業(yè)務代碼
 for {
  cmd := exec.Command(args[1], args[2:]...)
  cmd.Stdin = os.Stdin
  cmd.Stdout = os.Stdout
  cmd.Stderr = os.Stderr
  err := cmd.Start()//開啟子進程
  if err != nil {
   fmt.Fprintf(os.Stderr, "start oasis erir [-] Error: %s\n", err)
   return
  }
  fmt.Println("run oasis bydeamon,pid=", cmd.Process.Pid, ",ppid=", os.Getpid(), "args=", args, "time=", time.Now())
  cmd.Wait() //阻塞等待進程退出
 }
}

test.go

package test
import (
 "flag"
 "fmt"
)
func main() {
   fmt.Println("start test Service") 
}

以守護進程的方式啟動進程命令:

deamon -cmd “test”

如果執(zhí)行test要帶命令行,可直接作為deamon的命令行傳遞給test:

deamon -cmd “test” -c “config.yaml”

有關運行參數(shù)flag定義,可根據(jù)需要自行定義,這里僅是一個例子。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Golang中goto跳轉(zhuǎn)語句的實現(xiàn)

    Golang中goto跳轉(zhuǎn)語句的實現(xiàn)

    本文主要介紹了Golang中goto跳轉(zhuǎn)語句的實現(xiàn),包括標簽的定義、跳轉(zhuǎn)語句的使用、作用域限制、避免濫用的原因以及歷史遺留代碼中的使用情況,感興趣的可以了解一下
    2025-03-03
  • Golang?Mutex互斥鎖源碼分析

    Golang?Mutex互斥鎖源碼分析

    本篇文章,我們將一起來探究下Golang?Mutex底層是如何實現(xiàn)的,知其然,更要知其所以然。文中的示例代碼講解詳細,感興趣的可以了解一下
    2022-10-10
  • 一文帶你玩轉(zhuǎn)Golang Prometheus Eexporter開發(fā)

    一文帶你玩轉(zhuǎn)Golang Prometheus Eexporter開發(fā)

    本文分兩大塊,一是搞清楚prometheus四種類型的指標Counter,Gauge,Histogram,Summary用golang語言如何構造這4種類型對應的指標,二是搞清楚修改指標值的場景和方式,感興趣的可以了解一下
    2023-02-02
  • 使用Viper處理Go應用程序的配置方法

    使用Viper處理Go應用程序的配置方法

    Viper是一個應用程序配置解決方案,用于Go應用程序,它支持JSON、TOML、YAML、HCL、envfile和Java properties配置文件格式,這篇文章主要介紹了使用Viper處理Go應用程序的配置,需要的朋友可以參考下
    2023-09-09
  • go?doudou應用中使用注解示例詳解

    go?doudou應用中使用注解示例詳解

    這篇文章主要為大家介紹了go?doudou應用中使用注解示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • golang的強制類型轉(zhuǎn)換實現(xiàn)

    golang的強制類型轉(zhuǎn)換實現(xiàn)

    這篇文章主要介紹了golang的強制類型轉(zhuǎn)換實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • 淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因

    淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因

    本文主要介紹了淺談Go語言不提供隱式數(shù)字轉(zhuǎn)換的原因,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Go單元測試利器testify使用示例詳解

    Go單元測試利器testify使用示例詳解

    這篇文章主要為大家介紹了Go單元測試利器testify使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • 關于Go 是傳值還是傳引用?

    關于Go 是傳值還是傳引用?

    這篇文章主要討論Go語言 是傳值還是傳引用?文章先從Go 官方的定義展開,隨后是傳值和傳引用得介紹到map 和 slice得區(qū)別,需要的小伙伴可以參考一下文章得具體內(nèi)容
    2021-10-10
  • Go語言變量與基礎數(shù)據(jù)類型詳情

    Go語言變量與基礎數(shù)據(jù)類型詳情

    Go 是靜態(tài)(編譯型)語言,是區(qū)別于解釋型語言的弱類型語言(靜態(tài):類型固定,強類型:不同類型不允許直接運算),下面文章將對其進行詳細介紹,需要的朋友可以參考一下
    2021-09-09

最新評論

德昌县| 汽车| 遂昌县| 武强县| 东丽区| 镇宁| 普陀区| 玛纳斯县| 威海市| 田东县| 商丘市| 栖霞市| 贵港市| 呼和浩特市| 嘉祥县| 化州市| 绥江县| 兴安盟| 五台县| 聂荣县| 甘南县| 城固县| 锦州市| 甘孜| 中西区| 恭城| 明水县| 平昌县| 衡东县| 巍山| 措美县| 盐城市| 封开县| 尚义县| 东乌珠穆沁旗| 汉寿县| 普宁市| 敦煌市| 永城市| 旬邑县| 富阳市|