<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                [TOC] # 架構 ![](https://box.kancloud.cn/9a0f7963a8db70369dcf8109b8ae72d4_2974x1482.png) ## shell調用 ~~~ import ( "fmt" "os/exec" ) func main() { var ( cmd *exec.Cmd output []byte err error ) //生成cmd cmd = exec.Command("/usr/local/bin/bash", "-c", "sleep 5; ls -lah; echo 'hello'") //執行了命令,捕獲了子進程的輸出(pipe) if output, err = cmd.CombinedOutput(); err != nil { fmt.Println(err) return } //打印子進程輸出,要轉換為string不然是字節數組 fmt.Println(string(output)) } ~~~ ## 可終止調用 ~~~ import ( "context" "fmt" "os/exec" "time" ) //定義結構體,把進程的錯誤和輸出賦值給他 type result struct { err error output []byte } func main() { var ( ctx context.Context cancelFunc context.CancelFunc cmd *exec.Cmd //一個通信協程 resultChan chan *result res *result ) //創建了一個通信協程 resultChan = make(chan *result, 1000) //外面上下文繼承了里面參數的上下文 // 他會創建一個上下文和取消上下文函數 /** context: 里面有個chan byte cancelFunc: close(chan byte)他做的事情是把chan關閉了 */ ctx, cancelFunc = context.WithCancel(context.TODO()) //執行一個cmd,讓他在一個協程中執行 go func() { var ( output []byte err error ) //命令和上下文交互 //他內部維護了context這個對象,他內部會select{case <- ctx.Done()}監聽這個channel是否關閉,如果發現關閉就會kill pid殺死子進程 cmd = exec.CommandContext(ctx, "/usr/local/bin/bash", "-c", "sleep 2; ls -lah; echo 'hello'") //執行任務捕獲輸出 output, err = cmd.CombinedOutput() //結果輸出出去 resultChan <- &result{ err: err, output: output, } }() //幾秒后取消上下文,可以改下讓他子協程不能輸出 time.Sleep(3 * time.Second) //取消上下文 cancelFunc() //在main協程里面,等待子協程退出,并打印任務執行結果 res = <-resultChan //打印任務執行結果 fmt.Println(res.err, string(res.output)) } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看