package
2.0.0
Repository: https://github.com/cute-angelia/go-utils.git
Documentation: pkg.go.dev

# README

bak code 2021年09月24日

package icmd

import (
	"bytes"
	"context"
	"errors"
	"log"
	"os"
	"os/exec"
	"syscall"
	"time"
)

func Exec(exePath string, param []string, timeout time.Duration, logFile string) (*exec.Cmd, error) {
	ctx, cancel := context.WithTimeout(context.Background(), timeout)
	defer cancel()
	cmd := exec.CommandContext(ctx, exePath, param...)
	cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

	// 处理日志
	if len(logFile) == 0 {
		var b bytes.Buffer
		cmd.Stdout = &b
		cmd.Stderr = &b
		//if err := cmd.Start(); err != nil {
		//	log.Printf("Exce cmd error: %s", err.Error())
		//	return nil, err
		//}
		cmd.Run()

		// log.Println("result:",b.String())

		return cmd, errors.New(b.String())
	} else {
		logOut, err := os.OpenFile(logFile, os.O_CREATE|os.O_WRONLY, 0644)
		if err != nil {
			return nil, err
		}
		defer logOut.Close()
		// 将标准输出和标准错误都写到log中
		cmd.Stdout = logOut
		cmd.Stderr = logOut
		log.Printf("Exce cmd: %v", param)
		if err := cmd.Start(); err != nil {
			log.Printf("Exce cmd error: %s", err.Error())
			return nil, err
		}
		return cmd, nil
	}
}

func KillCmd(cmd *exec.Cmd) error {
	if cmd == nil || cmd.Process == nil {
		return errors.New("process not found or already stopped")
	}

	log.Printf("Kill CMD. pid: %d", cmd.Process.Pid)

	err := syscall.Kill(-cmd.Process.Pid, syscall.SIGKILL)
	if err != nil {
		return err
	}

	// 如果不wait,则会产生僵尸进程
	go cmd.Wait() // 为了不阻塞,另外起一个线程去Wait

	return nil
}

# Functions

No description provided by the author