您好,登錄后才能下訂單哦!
package main
import (
"fmt"
"os/exec"
)
func main() {
var (
cmd *exec.Cmd
err error
)
cmd = exec.Command("/bin/bash", "-c", "echo 1")
err = cmd.Run()
fmt.Println(err)
}
package main
import (
"fmt"
"os/exec"
)
func main() {
var (
cmd *exec.Cmd
output []byte
err error
)
// 生成Cmd
cmd = exec.Command("/bin/bash", "-c", "ls -la /")
// 執行了命令, 捕獲了子進程的輸出( pipe )
if output, err = cmd.CombinedOutput(); err != nil {
fmt.Println(err)
return
}
//打印子進程的輸出
fmt.Println(string(output))
}
goroutine執行linux命令,睡了2秒。而main睡一秒就殺死了bash,輸出結果為:signal: killed:
package main
import (
"context"
"fmt"
"os/exec"
"time"
)
type result struct {
err error
output []byte
}
func main() {
//執行一個cmd,讓它在一個協程里執行,讓它執行2秒
//1秒的時候,我們殺死cmd
var (
ctx context.Context
cancelFunc context.CancelFunc
cmd *exec.Cmd
resultChan chan *result
res *result
)
//創建一個結果隊列
resultChan = make(chan *result, 1000)
//context里有個channel,返回一個cancelFunc來關掉channel
//context.上下文繼承了context.TODO()上下文
ctx,cancelFunc = context.WithCancel(context.TODO())
go func() {
var (
output []byte
err error
)
//exec.Command()是沒辦法被取消的
cmd = exec.CommandContext(ctx,"/bin/bash", "-c", "sleep 2;echo hello;") //里面有個select{case <- ctx.Done()},一旦檢測到調用了cancelFunc,則kill掉bash程序(kill pid,進程id,殺死子進程)
//執行任務,捕獲輸出
output, err = cmd.CombinedOutput()
//把任務輸出結果傳給main協程
resultChan <- &result{
err: err,
output: output,
}
}()
//繼續往下走
time.Sleep(1 * time.Second)
//取消上下文
cancelFunc()
//在main協程里, 等待子協程的退出,并打印任務執行結果
res = <- resultChan
// 打印任務執行結果
fmt.Println(res.err, string(res.output))
}
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。