golang exec.Command執行腳本 殺死子進程

package main import ( "bytes"
    "os/exec"
    "fmt"
    "context"
    "time"
    "syscall" ) func main() { var ( cmd *exec.Cmd //output []byte //err error
 ) ctx, cancelFunc := context.WithCancel(context.Background()) go func() { // 生成Cmd
        cmd = exec.CommandContext(ctx, "/bin/bash", "-c", "/usr/bin/php ./b.php") cmd.SysProcAttr = &syscall.SysProcAttr{} var b bytes.Buffer cmd.Stdout = &b //劇透,坑在這裏
        cmd.Stderr = &b if err := cmd.Start(); err != nil { fmt.Println(err) return } // 超時殺掉進程組 或正常退出
 go func() { select { case <-ctx.Done(): fmt.Println( cmd.Process.Pid) } }() if err := cmd.Wait(); err != nil { fmt.Println(err) fmt.Println("recive: ", b.String()) return } fmt.Println("recive: ", b.String()) }() time.Sleep(time.Second*20) cancelFunc() fmt.Println(9999999) // 打印子進程的輸出
    time.Sleep(time.Second*1000) }

 

b.php  會運行1500秒後纔會中止php

<?php $a = true; while ($a) { for($i=1;$i<=1500;$i++){ sleep(1); if($i == 1500){ $a = false; } } } echo 5566; exit;

 

 

go run ./main.golinux

 

同時查看進程運行狀態golang

ps -aux|grep b.phpbash

[root@serv-test etcd-v3.3.13-linux-amd64]# ps -aux|grep b.php Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ root 17758  0.0  0.0 263856 11532 pts/2    S+   16:56   0:00 /usr/bin/php ./b.php root 18069  0.0  0.0 103340   920 pts/1    S+   16:56   0:00 grep b.php

 

 當20秒事後 golang程序會中止執行該任務  同時打印出了pid進程號spa

[root@serv-test golang-test]# go run ./main.go 開始 9999999
17758 signal: killed

 

 再次查看pid進程狀態 發現進程已經不存在了code

[root@serv-test etcd-v3.3.13-linux-amd64]# ps -aux|grep b.php
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
root     26397  0.0  0.0 103336   916 pts/1    S+   17:00   0:00 grep b.php
相關文章
相關標籤/搜索