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

$a = true;
while ($a) {
   for($i=1;$i<=1500;$i++){
       sleep(1);
       if($i == 1500){
            $a = false;
       }
    }
}


echo 5566;


exit;

 

 

go run ./main.go

 

同時查看進程運行狀態

ps -aux|grep b.php

[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進程號

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

 

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

[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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM