概述
经过
- golang 中实现 执行命令的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| func (c *Client) Output(name string, arg ...string) ([]byte, error) { session, err := c.sshClient.NewSession() if err != nil { return nil, fmt.Errorf("fail to create ssh seesion %w", err) } defer session.Close()
var stdoutBuf, stderrBuf strings.Builder session.Stdout = &stdoutBuf session.Stderr = &stderrBuf
cmdStr := strings.Join(append([]string{name}, arg...), " ")
err = session.Run(cmdStr) if err != nil { output := stdoutBuf.String() + "\n" + stderrBuf.String() return nil, fmt.Errorf("command execution failed: %w ;Output:%s ", err, output) }
return []byte(stdoutBuf.String() + "\n" + stderrBuf.String()), nil }
|
在执行 xxxx & 后, 父进程退出时, 此子进程会退出
后面 用 strace 跟踪, 才发现打开了一个匿名管道, 因为 golang session.Run 方法里面会为这个命令打开一个匿名管道, 然后异步命令执行后, 父进程退出, 将匿名管道退出, 子进程收到匿名管道退出的信号,结果退出了.