github.com/hy3/cuto@v0.9.8-0.20160830082821-aa6652f877b7/util/proc_unix.go (about)

     1  // +build darwin linux
     2  
     3  package util
     4  
     5  import (
     6  	"bytes"
     7  	"fmt"
     8  	"io"
     9  	"os/exec"
    10  	"strings"
    11  )
    12  
    13  func isProcessExists(pid int) bool {
    14  	ptn := fmt.Sprintf(`^\s*%d$`, pid)
    15  
    16  	pgrepCmd := exec.Command("ps", "-eo", "pid")
    17  	grepCmd := exec.Command("grep", ptn)
    18  	wcCmd := exec.Command("wc", "-l")
    19  
    20  	r1, w1 := io.Pipe()
    21  	pgrepCmd.Stdout = w1
    22  	grepCmd.Stdin = r1
    23  
    24  	r2, w2 := io.Pipe()
    25  	grepCmd.Stdout = w2
    26  	wcCmd.Stdin = r2
    27  
    28  	b := new(bytes.Buffer)
    29  	wcCmd.Stdout = b
    30  
    31  	if err := pgrepCmd.Start(); err != nil {
    32  		panic(err)
    33  	}
    34  	if err := grepCmd.Start(); err != nil {
    35  		panic(err)
    36  	}
    37  	if err := wcCmd.Start(); err != nil {
    38  		panic(err)
    39  	}
    40  	pgrepCmd.Wait()
    41  	w1.Close()
    42  	grepCmd.Wait()
    43  	w2.Close()
    44  	wcCmd.Wait()
    45  
    46  	s := strings.Trim(b.String(), " \t\r\n")
    47  	if s == "0" {
    48  		return false
    49  	}
    50  	return true
    51  }