123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- package util
- import (
- "fmt"
- "os"
- "os/exec"
- "strconv"
- "strings"
- )
- // GetSubProcessPid 只用于一个子进程
- func GetSubProcessPid(pid int) (int, error) {
- pgrepCmd := exec.Command("pgrep", "-P", strconv.Itoa(pid))
- output, err := pgrepCmd.CombinedOutput()
- if err != nil {
- return 0, err
- }
- replace := strings.Replace(string(output), "\n", "", 1)
- subProcessPid, err := strconv.Atoi(replace)
- if err != nil {
- return 0, err
- }
- return subProcessPid, nil
- }
- func ExecuteWithPath(path string, name string, arg ...string) (*exec.Cmd, error) {
- // 创建一个Cmd对象,表示要执行的命令
- cmd := exec.Command(name, arg...)
- // 指定目录
- cmd.Dir = path
- err := cmd.Start()
- if err != nil {
- return nil, err
- } else {
- // 执行命令并等待它完成d
- return cmd, nil
- }
- }
- func ExecuteWithDirAsync(dir string, name string, arg ...string) (*exec.Cmd, error) {
- // 创建一个Cmd对象,表示要执行的命令
- cmd := exec.Command(name, arg...)
- // 指定目录
- cmd.Dir = dir
- go func() {
- _, output, err := ExecuteWithDirSync(dir, name, arg...)
- if err != nil {
- fmt.Println("Error waiting for command,【output】=", output, ",【err】=", err)
- }
- }()
- return cmd, nil
- }
- //func ExecuteWithDirAsync(dir string, name string, arg ...string) (*exec.Cmd, error) {
- // // 创建一个Cmd对象,表示要执行的命令
- // cmd := exec.Command(name, arg...)
- // // 指定目录
- // cmd.Dir = dir
- // err := cmd.Start()
- // if err != nil {
- // return nil, err
- // } else {
- // return cmd, nil
- // }
- //}
- func ExecuteWithDirSync(dir string, name string, arg ...string) (*exec.Cmd, string, error) {
- cmd := exec.Command(name, arg...)
- cmd.Dir = dir
- combinedOutput, err := cmd.CombinedOutput()
- if err != nil {
- return nil, "", err
- }
- return cmd, string(combinedOutput), nil
- }
- func ExecuteWithEnvAndDirAsync(envs []string, dir string, name string, arg ...string) (*exec.Cmd, error) {
- cmd := exec.Command(name, arg...)
- cmd.Dir = dir
- for _, env := range envs {
- cmd.Env = append(cmd.Env, env)
- }
- if err := cmd.Start(); err != nil {
- return nil, err
- }
- return cmd, nil
- }
- // KillProcessByPid 必须使用该golang原生方法,通过直接执行kill命令行不通。
- func KillProcessByPid(pid int) error {
- process, err := os.FindProcess(pid)
- if err != nil {
- return err
- }
- err = process.Kill()
- if err != nil {
- return err
- }
- return nil
- }
- func Execute(name string, arg ...string) (*exec.Cmd, string, error) {
- cmd := exec.Command(name, arg...)
- combinedOutput, err := cmd.CombinedOutput()
- if err != nil {
- return nil, "", err
- }
- return cmd, string(combinedOutput), nil
- }
- func ExecuteSync(name string, arg ...string) (*exec.Cmd, string, error) {
- cmd := exec.Command(name, arg...)
- combinedOutput, err := cmd.CombinedOutput()
- if err != nil {
- return nil, "", err
- }
- return cmd, string(combinedOutput), nil
- }
- func ExecuteWithEnvSync(envs []string, name string, arg ...string) (*exec.Cmd, string, error) {
- cmd := exec.Command(name, arg...)
- for _, env := range envs {
- cmd.Env = append(cmd.Env, env)
- }
- combinedOutput, err := cmd.CombinedOutput()
- if err != nil {
- return nil, "", err
- }
- return cmd, string(combinedOutput), nil
- }
- func ExecuteWithEnvAndDir(envs []string, dir string, name string, arg ...string) (*exec.Cmd, string, error) {
- cmd := exec.Command(name, arg...)
- cmd.Dir = dir
- for _, env := range envs {
- cmd.Env = append(cmd.Env, env)
- }
- combinedOutput, err := cmd.CombinedOutput()
- if err != nil {
- return nil, string(combinedOutput), err
- }
- return cmd, string(combinedOutput), nil
- }
|