您好,登錄后才能下訂單哦!
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 /")
// 執(zhí)行了命令, 捕獲了子進(jìn)程的輸出( pipe )
if output, err = cmd.CombinedOutput(); err != nil {
fmt.Println(err)
return
}
//打印子進(jìn)程的輸出
fmt.Println(string(output))
}
goroutine執(zhí)行l(wèi)inux命令,睡了2秒。而main睡一秒就殺死了bash,輸出結(jié)果為:signal: killed:
package main
import (
"context"
"fmt"
"os/exec"
"time"
)
type result struct {
err error
output []byte
}
func main() {
//執(zhí)行一個(gè)cmd,讓它在一個(gè)協(xié)程里執(zhí)行,讓它執(zhí)行2秒
//1秒的時(shí)候,我們殺死cmd
var (
ctx context.Context
cancelFunc context.CancelFunc
cmd *exec.Cmd
resultChan chan *result
res *result
)
//創(chuàng)建一個(gè)結(jié)果隊(duì)列
resultChan = make(chan *result, 1000)
//context里有個(gè)channel,返回一個(gè)cancelFunc來關(guān)掉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;") //里面有個(gè)select{case <- ctx.Done()},一旦檢測(cè)到調(diào)用了cancelFunc,則kill掉bash程序(kill pid,進(jìn)程id,殺死子進(jìn)程)
//執(zhí)行任務(wù),捕獲輸出
output, err = cmd.CombinedOutput()
//把任務(wù)輸出結(jié)果傳給main協(xié)程
resultChan <- &result{
err: err,
output: output,
}
}()
//繼續(xù)往下走
time.Sleep(1 * time.Second)
//取消上下文
cancelFunc()
//在main協(xié)程里, 等待子協(xié)程的退出,并打印任務(wù)執(zhí)行結(jié)果
res = <- resultChan
// 打印任務(wù)執(zhí)行結(jié)果
fmt.Println(res.err, string(res.output))
}
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。