欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品

主頁(yè) > 知識(shí)庫(kù) > golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作

golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作

熱門標(biāo)簽:電話機(jī)器人軟件免費(fèi) 百度地圖標(biāo)注后傳給手機(jī) 涿州代理外呼系統(tǒng) 阿克蘇地圖標(biāo)注 外呼系統(tǒng)顯本地手機(jī)號(hào) 外呼系統(tǒng)用什么卡 excel地圖標(biāo)注分布數(shù)據(jù) 壽光微信地圖標(biāo)注 評(píng)價(jià)高的400電話辦理

啟動(dòng)命令

我們先來(lái)個(gè)非后臺(tái)運(yùn)行的啟動(dòng)命令

func init() {
    startCmd := cobra.Command{
        Use:   "start",
        Short: "Start Gonne",
        Run: func(cmd *cobra.Command, args []string) {
            startHttp()
        },
    }
    startCmd.Flags().BoolVarP(daemon, "deamon", "d", false, "is daemon?")
    RootCmd.AddCommand(startCmd)
 
}

startHttp方法啟動(dòng)一個(gè)http的web服務(wù)

func startHttp() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintf(w, "Hello cmd!")
    })
    if err := http.ListenAndServe(":9090", nil); err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

現(xiàn)在通過(guò)gonne start便可以啟動(dòng)一個(gè)web服務(wù)了,但是程序停留在命令行,如果ctrl+C程序也會(huì)終止了

命令行參數(shù)

如果想要后臺(tái)啟動(dòng),那么得讓start命令知道是要后臺(tái)運(yùn)行的,參照docker命令行的方式就是加上-d,給一個(gè)命令添加參數(shù)的判斷只需很少的代碼

改造一下代碼

func init() {
    var daemon bool
    startCmd := cobra.Command{
        Use:   "start",
        Short: "Start Gonne",
        Run: func(cmd *cobra.Command, args []string) {
            if daemon {
        fmt.Println("gonne start",daemon)        
            }
            startHttp()
        },
    }
    startCmd.Flags().BoolVarP(daemon, "deamon", "d", false, "is daemon?")
    RootCmd.AddCommand(startCmd)
 
}

命令行輸入

gonne start -d

這樣就可以接收到-d參數(shù)了,這里要說(shuō)明一下,第一個(gè)參數(shù)取值,第二個(gè)參數(shù)代碼--deamon,第三個(gè)參數(shù)代表-d

第四個(gè)參數(shù)代碼不加-d時(shí)候的默認(rèn)值,第五參數(shù)是描述

后臺(tái)運(yùn)行

后臺(tái)運(yùn)行其實(shí)這里使用的是一個(gè)巧妙的方法,就是使用系統(tǒng)的command命令行啟動(dòng)自己的命令行輸入,是不是有點(diǎn)繞,再看看看改造后的代碼

Run: func(cmd *cobra.Command, args []string) {
  if daemon {
    command := exec.Command("gonne", "start")
    command.Start()
    fmt.Printf("gonne start, [PID] %d running...\n", command.Process.Pid)
    ioutil.WriteFile("gonne.lock", []byte(fmt.Sprintf("%d", command.Process.Pid)), 0666)
    daemon = false
    os.Exit(0)
  } else {
    fmt.Println("gonne start")
  }
  startHttp()
},

用exec的Command啟動(dòng)剛輸入的gonne start -d,就會(huì)攔截到這條請(qǐng)求然后通過(guò)gonne start,但是程序就不會(huì)停留在命令行了,然后發(fā)現(xiàn)http服務(wù)還在,還可以訪問(wèn)。

還有一點(diǎn)就是把pid輸出到gonne.lock文件,給停止的程序調(diào)用

終止后臺(tái)程序

有了之前的操作后,停止就簡(jiǎn)單多了

func init() {
    RootCmd.AddCommand(stopCmd)
}
 
var stopCmd = cobra.Command{
    Use:   "stop",
    Short: "Stop Gonne",
    Run: func(cmd *cobra.Command, args []string) {
        strb, _ := ioutil.ReadFile("gonne.lock")
        command := exec.Command("kill", string(strb))
        command.Start()
        println("gonne stop")
    },
}

執(zhí)行 gonne stop 即可終止之前啟動(dòng)的http服務(wù)

help命令

好了,關(guān)于命令的操作講完了,再看看cobra給的福利,自動(dòng)生成的help命令

這個(gè)不需要你做什么操作,只需要輸入gonne help,相關(guān)信息已經(jīng)幫你生產(chǎn)好了。

appletekiMacBook-Pro:andev apple$ gonne help
Usage:
  gonne [flags]
  gonne [command]
 
Available Commands:
  help        Help about any command
  start       Start Gonne
  stop        Stop Gonne
  version     Print the version number of Gonne
 
Flags:
  -h, --help   help for gonne
 
Use "gonne [command] --help" for more information about a command.

當(dāng)然,子命令也有

appletekiMacBook-Pro:andev apple$ gonne start -h
Start Gonne
 
Usage:
  gonne start [flags]
 
Flags:
  -d, --deamon   is daemon?
  -h, --help     help for start

自此告別各種腳本!

補(bǔ)充:golang子進(jìn)程的啟動(dòng)和停止,mac與linux的區(qū)別

今天接到一個(gè)任務(wù)是將原來(lái)運(yùn)行在mac的應(yīng)用移植到linux,原因當(dāng)然是因?yàn)榭蛻裟沁叜?dāng)前是linux環(huán)境,也不想再采購(gòu)mac電腦。

通常來(lái)說(shuō),這個(gè)工作并不難,因?yàn)槲疫x用的服務(wù)器端技術(shù)是c或者golang,這兩種技術(shù)具有很好的可移植性,而且大多是重新編譯即可運(yùn)行,所以接到任務(wù)的開(kāi)始并沒(méi)有把這個(gè)當(dāng)一回事。

跟想象中的也差不多,搭建好linux測(cè)試服務(wù)器,在mac上把運(yùn)行很久的應(yīng)用重新交叉編譯了一遍,部署到linux實(shí)驗(yàn)環(huán)境,啟動(dòng)、測(cè)試,看起來(lái)一切正常。準(zhǔn)備打包交活,這時(shí)候發(fā)現(xiàn)一個(gè)問(wèn)題,程序無(wú)法終止。

簡(jiǎn)單調(diào)試后就找到了原因,在系統(tǒng)中啟動(dòng)的子進(jìn)程,發(fā)出終止信號(hào)之后居然仍在運(yùn)行,導(dǎo)致父進(jìn)程也一直無(wú)法退出,尷尬了。

列一下采用的代碼(代碼為簡(jiǎn)化版僅供示例):

func startChild1() {
 cmd := exec.Command("/bin/sh", "-c", "sleep 1000")
 time.AfterFunc(10*time.Second, func() {
  fmt.Println("PID1=", cmd.Process.Pid)
  syscall.Kill(-cmd.Process.Pid, syscall.SIGQUIT)
  fmt.Println("killed")
 })
 fmt.Println("begin run")
 cmd.Run()
}

示例代碼首先啟動(dòng)一個(gè)sleep的子進(jìn)程,表示某個(gè)子業(yè)務(wù)開(kāi)始工作,然后延時(shí)10秒鐘之后,把這個(gè)子進(jìn)程殺死。

這段代碼啟動(dòng)子進(jìn)程和關(guān)閉子進(jìn)程在mac電腦的原有系統(tǒng)上工作都很正常,但是到了linux,啟動(dòng)子進(jìn)程仍然沒(méi)有問(wèn)題,關(guān)閉子進(jìn)程不成功。

檢查了一下在linux的工作過(guò)程,發(fā)現(xiàn)啟動(dòng)子進(jìn)程之后,實(shí)際上是啟動(dòng)了兩個(gè)進(jìn)程,一個(gè)進(jìn)程是/bin/sh,隨后sh又啟動(dòng)了一個(gè)子進(jìn)程自身的子進(jìn)程sleep。

而發(fā)出退出命令的時(shí)候,只有sh退出了,sleep進(jìn)程仍然繼續(xù)運(yùn)行。對(duì)比同樣的mac電腦上,sh進(jìn)程是沒(méi)有出現(xiàn)的,只有一個(gè)sleep進(jìn)程,所以發(fā)出退出命令的時(shí)候,sleep正常關(guān)閉,系統(tǒng)表現(xiàn)正常。

使用/bin/sh來(lái)啟動(dòng)另外的命令行程序是有原因的,這源于golang本身的設(shè)計(jì),golang的exec.Command,后面第一個(gè)參數(shù)是命令行程序本身,之后的每一個(gè)exec.Command參數(shù),都代表命令行程序的一個(gè)參數(shù),而不是我們常用的,命令行程序路徑和參數(shù)都可以寫(xiě)在一個(gè)字符串,用空格隔開(kāi)即可。

所以有的時(shí)候我們是為了省事,也有的時(shí)候是順手移植了別的語(yǔ)言的代碼,就使用/bin/sh來(lái)啟動(dòng)需要的命令行程序,就如同上面示例代碼一樣,這樣情況下,除了-c參數(shù)要單獨(dú)占用一個(gè)字符串,我們?cè)疽獑?dòng)的字符串程序及其參數(shù),就可以如同常見(jiàn)語(yǔ)言處理方式那樣,放在一個(gè)字符串了。

我們可以嘗試一下這個(gè)代碼:

func startChild2() {
 cmd := exec.Command("sleep", "1000")
 time.AfterFunc(10*time.Second, func() {
  fmt.Println("PID2=", cmd.Process.Pid)
  syscall.Kill(-cmd.Process.Pid, syscall.SIGQUIT)
  fmt.Println("killed")
 })
 fmt.Println("begin run")
 cmd.Run()
}

測(cè)試一下,這段代碼因?yàn)闆](méi)有經(jīng)過(guò)/bin/sh程序,在linux上也只有sleep這一個(gè)進(jìn)程被建立,直接向其發(fā)出退出指令是可以正常工作的。這從進(jìn)程的觀察中及實(shí)驗(yàn)的結(jié)果中,都可以證實(shí)我們的判斷。

知道了原因,處理起來(lái)也很容易,一是把程序改成類似上面這樣的方式啟動(dòng)進(jìn)程。另外一個(gè)辦法則是直接為/bin/sh及我們的命令行進(jìn)程建立一個(gè)進(jìn)程組,這樣最后發(fā)出的指令退出這個(gè)進(jìn)程組,同樣可以同時(shí)退出/bin/sh及sleep兩個(gè)進(jìn)程,達(dá)到我們的需求。

寫(xiě)代碼測(cè)試一下:

func startChild3() {
 cmd := exec.Command("/bin/sh", "-c", "sleep 1000")
 cmd.SysProcAttr = syscall.SysProcAttr{Setpgid: true}
 time.AfterFunc(10*time.Second, func() {
  fmt.Println("PID3=", cmd.Process.Pid)
  syscall.Kill(-cmd.Process.Pid, syscall.SIGQUIT)
  fmt.Println("killed")
 })
 fmt.Println("begin run")
 cmd.Run()
}

經(jīng)過(guò)實(shí)際測(cè)試,這段代碼在不改變?cè)械拿钚袇?shù)傳遞習(xí)慣的基礎(chǔ)上,可以正常在linux及mac電腦順利執(zhí)行。

最后再說(shuō)一下命令cmd.Process.Signal,golang文檔上說(shuō)的很清楚,這是向進(jìn)程發(fā)送消息信號(hào),比如同樣的syscall.SIGQUIT,這也是告訴子進(jìn)程退出的意思。

所以大多的應(yīng)用中,我們希望一個(gè)進(jìn)程退出,直接用:

cmd.Process.Signal(syscall.SIGQUIT)

也是可以正常執(zhí)行的,但對(duì)于我們上面說(shuō)的情況,如果先使用/bin/sh啟動(dòng)了另外一個(gè)子進(jìn)程,這種方法就無(wú)效了(指在linux無(wú)效,mac測(cè)試是一樣可以用的,關(guān)鍵區(qū)別同樣是在mac,/bin/sh進(jìn)程不會(huì)保留并等待我們啟動(dòng)的子進(jìn)程退出,所以退出消息可以正常的發(fā)送到正常的子進(jìn)程)。

所以為了跨平臺(tái)的通用性,建議還是使用Process.Kill或者syscall.Kill來(lái)殺死子進(jìn)程。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • golang 輸出重定向:fmt Log,子進(jìn)程Log,第三方庫(kù)logrus的詳解
  • Golang信號(hào)處理及如何實(shí)現(xiàn)進(jìn)程的優(yōu)雅退出詳解
  • golang如何實(shí)現(xiàn)mapreduce單進(jìn)程版本詳解
  • golang守護(hù)進(jìn)程用法示例

標(biāo)簽:吐魯番 蘭州 銅川 梅河口 汕頭 重慶 雞西 欽州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作》,本文關(guān)鍵詞  golang,后臺(tái),進(jìn)程,的,啟動(dòng),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于golang 后臺(tái)進(jìn)程的啟動(dòng)和停止操作的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    欧美阿v视频在线大全_亚洲欧美中文日韩V在线观看_www性欧美日韩欧美91_亚洲欧美日韩久久精品
  • <rt id="w000q"><acronym id="w000q"></acronym></rt>
  • <abbr id="w000q"></abbr>
    <rt id="w000q"></rt>
    一区二区三区免费看视频| 人妻精品久久久久中文字幕69| 星空大象在线观看免费播放| 国产精品66部| 99久久人妻无码精品系列| 日韩一区二区三区在线视频| 亚洲电影欧美电影有声小说| 好吊操视频这里只有精品| 欧洲精品一区二区| 一区二区三区日韩欧美| 日本中文字幕精品| 欧美三级资源在线| 亚洲va韩国va欧美va| 国产国语老龄妇女a片| 777午夜精品免费视频| 亚洲成人一区二区在线观看| 人妻 日韩 欧美 综合 制服| 欧美一二三区精品| 蜜臀99久久精品久久久久久软件| 中国美女乱淫免费看视频| 日韩色在线观看| 久久99九九99精品| 99自拍偷拍视频| 国产精品久久久久久久久快鸭 | 日韩女优一区二区| 亚洲欧美综合在线精品| av不卡免费在线观看| 欧美三级视频在线| 亚洲福利一区二区| 亚洲综合自拍网| 精品国产1区二区| 国产精品69毛片高清亚洲| 色综合中文字幕| 欧美日韩一区二区三区高清 | 日韩精品国产一区| 91精品国产综合久久精品图片| 日日夜夜精品视频天天综合网| 亚洲熟妇无码av| 国产欧美日本一区视频| av午夜精品一区二区三区| 欧美专区在线观看一区| 午夜天堂影视香蕉久久| 国产综合精品在线| 亚洲欧美日韩中文字幕一区二区三区| 欧美熟妇另类久久久久久多毛| 这里只有精品视频在线观看| 九一九一国产精品| 久久久精品视频免费观看| 亚洲午夜私人影院| 中文字幕在线1| 亚洲丝袜另类动漫二区| 在线黄色免费网站| 国产欧美一区二区三区在线看蜜臀 | 欧美三级韩国三级日本三斤| 秋霞午夜av一区二区三区 | 蜜臀a∨国产成人精品| 国产性生活大片| 亚洲一区二区av在线| 国产av自拍一区| 亚洲欧洲日产国码二区| 中文视频在线观看| 国产欧美一区二区精品性色超碰 | 久久精品一区二区| 中文字幕一二三| 精品久久一二三区| 99久久久无码国产精品| 日韩欧美国产高清| av电影在线观看一区| 精品国产精品网麻豆系列 | 成人毛片视频在线观看| 91精品国产91久久久久久最新毛片 | 日韩一级片网站| 国产黄色精品网站| 91精品国产aⅴ一区二区| 粉嫩av一区二区三区| 91精品国产综合久久久久久 | 亚洲影视在线观看| 纪美影视在线观看电视版使用方法| 亚洲免费资源在线播放| 欧美 日韩 成人| 亚洲国产视频一区二区| 亚洲精品一区二区三区在线播放| 性久久久久久久久久久久| 亚洲 欧美 国产 另类| 日韩精品一二区| 色视频成人在线观看免| 国内精品伊人久久久久影院对白| 欧美日韩在线三区| 福利一区福利二区| 精品国产一区二区国模嫣然| 99免费观看视频| 中文字幕一区二区三区四区 | 右手影院亚洲欧美| 一区二区三区在线免费| 二区三区四区视频| 麻豆精品新av中文字幕| 欧美日韩精品一区二区三区| 成人久久久精品乱码一区二区三区| 欧美成人午夜电影| 在线播放第一页| 亚洲欧美日韩精品久久久久| 长河落日免费高清观看| 美女久久久精品| 欧美一区二区三区在线看| 久久aaaa片一区二区| 日韩美女视频19| av激情在线观看| 国产成人免费在线观看不卡| 久久久久久久综合色一本| 女人被狂躁c到高潮| 午夜亚洲福利老司机| 欧美日韩一区二区三区在线| 91视频一区二区| 亚洲色图另类专区| 玖玖爱这里只有精品| 国产激情91久久精品导航 | a级大片在线观看| 日韩精品成人一区二区在线| 欧美日韩国产天堂| 免费在线观看日韩av| 一区二区三区在线播放| 色菇凉天天综合网| 99国产精品久久久久久久久久久 | 国产精品美女久久久久久久 | 青青草精品视频| 欧美一区二区三级| www.17c.com喷水少妇| 亚洲国产成人高清精品| 欧美色网一区二区| xxxx视频在线观看| 亚洲线精品一区二区三区八戒| 欧美视频一区二区三区在线观看| 91女厕偷拍女厕偷拍高清| 樱花草国产18久久久久| 欧美视频中文字幕| 无码人妻丰满熟妇啪啪网站| 亚洲国产综合视频在线观看| 欧美日韩精品系列| 三叶草欧洲码在线| 久久精品理论片| 国产午夜精品一区二区三区嫩草 | av男人天堂一区| 一级特黄大欧美久久久| 欧美色爱综合网| 国产精品成人99一区无码 | 欧美日韩不卡视频| 国产乱了高清露脸对白| 麻豆免费看一区二区三区| 国产亚洲欧美色| 动漫性做爰视频| 久久综合桃花网| 五月婷婷久久综合| 26uuu国产电影一区二区| 免费成人深夜蜜桃视频| 99久久99久久精品免费看蜜桃| 亚洲主播在线观看| 欧美一区二区三区四区高清| 熟女少妇内射日韩亚洲| 大桥未久av一区二区三区中文| 亚洲欧美一区二区三区久本道91| 欧美日韩精品一区二区三区| 欧美图片第一页| 国产一区二区在线视频| 亚洲天堂精品在线观看| 在线播放欧美女士性生活| 久久久久久久久福利| kk眼镜猥琐国模调教系列一区二区| 夜夜嗨av一区二区三区中文字幕| 欧美一区二区福利视频| 91成人免费在线| 9.1成人看片| 国产999精品久久| 亚洲国产精品久久人人爱蜜臀| 欧美大片在线观看一区二区| 182在线观看视频| 337p日本欧洲亚洲大胆张筱雨| 精品一区二区三区蜜桃| 亚洲人成在线播放网站岛国| 日韩欧美一区二区久久婷婷| 免费国产羞羞网站美图| 中国特级黄色大片| 国产一区二三区| 亚洲一区二区三区视频在线| 久久午夜羞羞影院免费观看| 91黄色免费版| 亚洲精品国产91| 91麻豆国产福利精品| 久久99国产精品久久99| 亚洲欧美另类久久久精品| 欧美刺激脚交jootjob| 在线视频一区二区三| 一级肉体全黄裸片| 丰满少妇一区二区三区专区| 激情五月播播久久久精品| 亚洲综合视频在线| 国产日韩av一区| 欧美一区二区在线视频| 色综合天天做天天爱| 素人fc2av清纯18岁| 91丝袜美腿高跟国产极品老师 |