golang执行命令行(一)

golang中会经常遇到要 fork 子进程的需求。go 标准库为我们封装了 os/exec标准包,当我们要运行外部命令时应该优先使用这个库。

执行 command

这里我简单结合contextCmd 模块写一个通用的执行 command 方法。代码如下:

// RunCmd ...
func RunCmd(ctx context.Context, cmd *exec.Cmd) error {
	if err := cmd.Start(); err != nil {
		return err
	}

	errCh := make(chan error, 1)
	go func() {
		errCh <- cmd.Wait()
	}()

	done := ctx.Done()
	for {
		select {
		case <-done:
			done = nil
			pid := cmd.Process.Pid
			if err := syscall.Kill(-1*pid, syscall.SIGKILL); err != nil {
				return err
			}
		case err := <-errCh:
			if done == nil {
				return ctx.Err()
			}
			return err
		}
	}
}


posted @ 2019-04-11 21:07  jssyjam  阅读(6413)  评论(0编辑  收藏  举报