欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

go調用shell命令兩種方式實現(xiàn)(有無返回值)

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

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

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

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

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

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

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

需要對shell標準輸出的逐行實時進行處理的

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

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

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

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

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

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

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

通過shell調用自己的程序,并且程序是死循環(huán),此時無法獲取返回結果(否則程序會一直阻塞直至調用的 程序結束)

適用于調用自己寫的程序(服務器死循環(huán),且不需要返回結果的)

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

官網(wǎng)的標準中文庫

引用部分文檔

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

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

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

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

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

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

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

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

執(zhí)行命令并返回標準輸出的切片。

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

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

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

相關文章

  • Golang實現(xiàn)程序優(yōu)雅退出的方法詳解

    Golang實現(xiàn)程序優(yōu)雅退出的方法詳解

    項目開發(fā)過程中,隨著需求的迭代,代碼的發(fā)布會頻繁進行,在發(fā)布過程中,Golang如何讓程序做到優(yōu)雅的退出?本文就來詳細為大家講講
    2022-06-06
  • Go實踐反向代理ReverseProxy解析

    Go實踐反向代理ReverseProxy解析

    這篇文章主要為大家介紹了Go實踐反向代理示例ReverseProxy解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • 一文深入探索Go語言中的循環(huán)結構

    一文深入探索Go語言中的循環(huán)結構

    在編程中,循環(huán)結構扮演著重要的角色,它使我們能夠有效地重復執(zhí)行特定的代碼塊,以實現(xiàn)各種任務和邏輯,在Go語言中,for 是 Go 中唯一的循環(huán)結構,本文將深入探討Go語言中的for循環(huán)類型以及它們的用法
    2023-08-08
  • Golang操作命令行的幾種方式總結

    Golang操作命令行的幾種方式總結

    這篇文章主要介紹了Golang操作命令行的幾種方式總結,文章通過圍主題思想展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-09-09
  • Go語言操作mysql數(shù)據(jù)庫簡單例子

    Go語言操作mysql數(shù)據(jù)庫簡單例子

    這篇文章主要介紹了Go語言操作mysql數(shù)據(jù)庫簡單例子,本文包含插入數(shù)據(jù)和查詢代碼實例,需要的朋友可以參考下
    2014-10-10
  • 淺談一下前端http與https有什么區(qū)別

    淺談一下前端http與https有什么區(qū)別

    這篇文章主要介紹了淺談一下前端http與https有什么區(qū)別,現(xiàn)今大部分的網(wǎng)站都已經(jīng)使用了 https 協(xié)議,那么https對比http協(xié)議有哪些不同呢,需要的朋友可以參考下
    2023-04-04
  • Go習慣用法(多值賦值短變量聲明賦值簡寫模式)基礎實例

    Go習慣用法(多值賦值短變量聲明賦值簡寫模式)基礎實例

    本文為大家介紹了Go習慣用法(多值賦值,短變量聲明和賦值,簡寫模式、多值返回函數(shù)、comma,ok 表達式、傳值規(guī)則)的基礎實例,幫大家鞏固扎實Go語言基礎
    2024-01-01
  • Go并發(fā)同步Mutex典型易錯使用場景

    Go并發(fā)同步Mutex典型易錯使用場景

    這篇文章主要為大家介紹了Go并發(fā)同步Mutex典型易錯使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • gin自定義中間件解決requestBody不可重讀(請求體取值)

    gin自定義中間件解決requestBody不可重讀(請求體取值)

    這篇文章主要介紹了gin自定義中間件解決requestBody不可重讀,確??刂破髂軌颢@取請求體值,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 利用rpm打包上線部署golang代碼的方法教程

    利用rpm打包上線部署golang代碼的方法教程

    RPM是RPM Package Manager(RPM軟件包管理器)的縮寫,這篇文章主要給大家介紹了關于利用rpm打包上線部署golang代碼的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01

最新評論