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

go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無(wú)返回值)

 更新時(shí)間:2021年12月08日 10:41:07   作者:風(fēng)逸者兒  
本文主要介紹了go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無(wú)返回值),主要用于執(zhí)行shell命令,并且返回shell的標(biāo)準(zhǔn)輸出,具有一定的參考價(jià)值,感興趣的可以了解一下

阻塞方式(需要執(zhí)行結(jié)果)

主要用于執(zhí)行shell命令,并且返回shell的標(biāo)準(zhǔn)輸出

適用于執(zhí)行普通非阻塞shell命令,且需要shell標(biāo)準(zhǔn)輸出的

//阻塞式的執(zhí)行外部shell命令的函數(shù),等待執(zhí)行完畢并返回標(biāo)準(zhǔn)輸出
func exec_shell(s string) (string, error){
    //函數(shù)返回一個(gè)*Cmd,用于使用給出的參數(shù)執(zhí)行name指定的程序
    cmd := exec.Command("/bin/bash", "-c", s)

    //讀取io.Writer類(lèi)型的cmd.Stdout,再通過(guò)bytes.Buffer(緩沖byte類(lèi)型的緩沖器)將byte類(lèi)型轉(zhuǎn)化為string類(lèi)型(out.String():這是bytes類(lèi)型提供的接口)
    var out bytes.Buffer
    cmd.Stdout = &out

    //Run執(zhí)行c包含的命令,并阻塞直到完成。  這里stdout被取出,cmd.Wait()無(wú)法正確獲取stdin,stdout,stderr,則阻塞在那了
    err := cmd.Run()
    checkErr(err)
    return out.String(), err
}

需要對(duì)shell標(biāo)準(zhǔn)輸出的逐行實(shí)時(shí)進(jìn)行處理的

func execCommand(commandName string, params []string) bool {
    //函數(shù)返回一個(gè)*Cmd,用于使用給出的參數(shù)執(zhí)行name指定的程序
    cmd := exec.Command(commandName, params...)

    //顯示運(yùn)行的命令
    fmt.Println(cmd.Args)
    //StdoutPipe方法返回一個(gè)在命令Start后與命令標(biāo)準(zhǔn)輸出關(guān)聯(lián)的管道。Wait方法獲知命令結(jié)束后會(huì)關(guān)閉這個(gè)管道,一般不需要顯式的關(guān)閉該管道。
    stdout, err := cmd.StdoutPipe()

    if err != nil {
        fmt.Println(err)
        return false
    }

    cmd.Start()
    //創(chuàng)建一個(gè)流來(lái)讀取管道內(nèi)內(nèi)容,這里邏輯是通過(guò)一行一行的讀取的
    reader := bufio.NewReader(stdout)

    //實(shí)時(shí)循環(huán)讀取輸出流中的一行內(nèi)容
    for {
        line, err2 := reader.ReadString('\n')
        if err2 != nil || io.EOF == err2 {
            break
        }
        fmt.Println(line)
    }

    //阻塞直到該命令執(zhí)行完成,該命令必須是被Start方法開(kāi)始執(zhí)行的
    cmd.Wait()
    return true
}

非阻塞方式(不需要執(zhí)行結(jié)果)

通過(guò)shell調(diào)用自己的程序,并且程序是死循環(huán),此時(shí)無(wú)法獲取返回結(jié)果(否則程序會(huì)一直阻塞直至調(diào)用的 程序結(jié)束)

適用于調(diào)用自己寫(xiě)的程序(服務(wù)器死循環(huán),且不需要返回結(jié)果的)

//不需要執(zhí)行命令的結(jié)果與成功與否,執(zhí)行命令馬上就返回
func exec_shell_no_result(command string) {
    //處理啟動(dòng)參數(shù),通過(guò)空格分離 如:setsid /home/luojing/gotest/src/test_main/iwatch/test/while_little &
    command_name_and_args := strings.FieldsFunc(command, splite_command)
    //開(kāi)始執(zhí)行c包含的命令,但并不會(huì)等待該命令完成即返回
    cmd.Start()
        if err != nil {
        fmt.Printf("%v: exec command:%v error:%v\n", get_time(), command, err)
    }
    fmt.Printf("Waiting for command:%v to finish...\n", command)
    //阻塞等待fork出的子進(jìn)程執(zhí)行的結(jié)果,和cmd.Start()配合使用[不等待回收資源,會(huì)導(dǎo)致fork出執(zhí)行shell命令的子進(jìn)程變?yōu)榻┦M(jìn)程]
    err = cmd.Wait()
    if err != nil {
        fmt.Printf("%v: Command finished with error: %v\n", get_time(), err)
    }
    return
}
/錯(cuò)誤處理函數(shù)
func checkErr(err error) {
    if err != nil {
        fmt.Println(err)
        panic(err)  
    }
}

官網(wǎng)的標(biāo)準(zhǔn)中文庫(kù)

引用部分文檔

func (*Cmd) Run
func (c *Cmd) Run() error

Run執(zhí)行c包含的命令,并阻塞直到完成。
如果命令成功執(zhí)行,stdin、stdout、stderr的轉(zhuǎn)交沒(méi)有問(wèn)題,并且返回狀態(tài)碼為0,方法的返回值為nil;如果命令沒(méi)有執(zhí)行或者執(zhí)行失敗,會(huì)返回*ExitError類(lèi)型的錯(cuò)誤;否則返回的error可能是表示I/O問(wèn)題。

func (*Cmd) Start
func (c *Cmd) Start() error

Start開(kāi)始執(zhí)行c包含的命令,但并不會(huì)等待該命令完成即返回。Wait方法會(huì)返回命令的返回狀態(tài)碼并在命令返回后釋放相關(guān)的資源。

func (*Cmd) Wait
func (c *Cmd) Wait() error

Wait會(huì)阻塞直到該命令執(zhí)行完成,該命令必須是被Start方法開(kāi)始執(zhí)行的。

如果命令成功執(zhí)行,stdin、stdout、stderr的轉(zhuǎn)交沒(méi)有問(wèn)題,并且返回狀態(tài)碼為0,方法的返回值為nil;如果命令沒(méi)有執(zhí)行或者執(zhí)行失敗,會(huì)返回*ExitError類(lèi)型的錯(cuò)誤;否則返回的error可能是表示I/O問(wèn)題。Wait方法會(huì)在命令返回后釋放相關(guān)的資源。

func (*Cmd) Output
func (c *Cmd) Output() ([]byte, error)

執(zhí)行命令并返回標(biāo)準(zhǔn)輸出的切片。

func (*Cmd) StderrPipe
func (c *Cmd) StderrPipe() (io.ReadCloser, error)

StderrPipe方法返回一個(gè)在命令Start后與命令標(biāo)準(zhǔn)錯(cuò)誤輸出關(guān)聯(lián)的管道。Wait方法獲知命令結(jié)束后會(huì)關(guān)閉這個(gè)管道,一般不需要顯式的關(guān)閉該管道。但是在從管道讀取完全部數(shù)據(jù)之前調(diào)用Wait是錯(cuò)誤的;同樣使用StderrPipe方法時(shí)調(diào)用Run函數(shù)也是錯(cuò)誤的。

到此這篇關(guān)于go調(diào)用shell命令兩種方式實(shí)現(xiàn)(有無(wú)返回值)的文章就介紹到這了,更多相關(guān)go調(diào)用shell內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • go-zero讀取請(qǐng)求體出現(xiàn)EOF錯(cuò)誤的解決方法

    go-zero讀取請(qǐng)求體出現(xiàn)EOF錯(cuò)誤的解決方法

    這篇文章主要為大家詳細(xì)介紹了go-zero讀取請(qǐng)求體出現(xiàn)EOF錯(cuò)誤時(shí)如何解決,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-02-02
  • 在Golang中使用iota案例詳解

    在Golang中使用iota案例詳解

    在Go語(yǔ)言中,iota是一個(gè)預(yù)定義的標(biāo)識(shí)符,用于在常量聲明中生成連續(xù)的遞增值,iota的值從0開(kāi)始,每次在常量聲明中使用時(shí)遞增,本就給大家講解一下Golang中iota的使用案例,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • goland 設(shè)置project gopath的操作

    goland 設(shè)置project gopath的操作

    這篇文章主要介紹了goland 設(shè)置project gopath的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Golang全局變量加鎖的問(wèn)題解決

    Golang全局變量加鎖的問(wèn)題解決

    這篇文章主要介紹了解決Golang全局變量加鎖的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • 一文詳解Golang?定時(shí)任務(wù)庫(kù)?gron?設(shè)計(jì)和原理

    一文詳解Golang?定時(shí)任務(wù)庫(kù)?gron?設(shè)計(jì)和原理

    這篇文章主要介紹了一文詳解Golang?定時(shí)任務(wù)庫(kù)?gron?設(shè)計(jì)和原理,gron是一個(gè)比較小巧、靈活的定時(shí)任務(wù)庫(kù),可以執(zhí)行定時(shí)的、周期性的任務(wù)。gron提供簡(jiǎn)潔的、并發(fā)安全的接口
    2022-08-08
  • Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)

    Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)

    按行讀取文件相較于一次性載入,有著很多優(yōu)勢(shì),如內(nèi)存效率高、處理速度快、實(shí)時(shí)性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對(duì)大家有所幫助
    2024-02-02
  • golang中beego入門(mén)

    golang中beego入門(mén)

    Beego是一個(gè)基于Go語(yǔ)言的開(kāi)源框架,用于構(gòu)建Web應(yīng)用程序和API,本文主要介紹了golang中beego入門(mén),具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • go并發(fā)編程sync.Cond使用場(chǎng)景及實(shí)現(xiàn)原理

    go并發(fā)編程sync.Cond使用場(chǎng)景及實(shí)現(xiàn)原理

    這篇文章主要為大家介紹了go并發(fā)編程sync.Cond使用場(chǎng)景及實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • 使用Go添加HTTPS的實(shí)現(xiàn)代碼示例

    使用Go添加HTTPS的實(shí)現(xiàn)代碼示例

    這篇文章主要介紹了使用Go添加HTTPS的實(shí)現(xiàn)代碼示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • go build和go install的區(qū)別介紹

    go build和go install的區(qū)別介紹

    這篇文章主要介紹了go build和go install的區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12

最新評(píng)論

海南省| 金寨县| 江北区| 苍梧县| 容城县| 曲靖市| 福海县| 贞丰县| 商南县| 南京市| 文安县| 西宁市| 泰安市| 阿拉善右旗| 肇源县| 沂源县| 柳河县| 永靖县| 黎川县| 东城区| 江安县| 北安市| 那曲县| 宜黄县| 汤阴县| 陵水| 尉犁县| 上栗县| 贞丰县| 兴山县| 津南区| 夏河县| 临沧市| 汶川县| 绵阳市| 乌苏市| 清新县| 大冶市| 泸定县| 抚顺市| 乾安县|