strace排查异步shell执行失败问题.md

概述

经过

  1. 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()

//cmdStr := strings.Join(append([]string{name}, arg...), " ")
//
//logger.Logger.Debugf("Output executing ssh command %s in %s", cmdStr, c.addr)
//
//return session.Output(cmdStr)
// Set up output buffers for stdout and stderr
var stdoutBuf, stderrBuf strings.Builder
session.Stdout = &stdoutBuf
session.Stderr = &stderrBuf

cmdStr := strings.Join(append([]string{name}, arg...), " ")

// Run the command
err = session.Run(cmdStr)
if err != nil {
// Combine stdout and stderr for detailed error message
output := stdoutBuf.String() + "\n" + stderrBuf.String()
return nil, fmt.Errorf("command execution failed: %w ;Output:%s ", err, output)
}

// Return combined output of stdout and stderr
return []byte(stdoutBuf.String() + "\n" + stderrBuf.String()), nil
}

在执行 xxxx & 后, 父进程退出时, 此子进程会退出

后面 用 strace 跟踪, 才发现打开了一个匿名管道, 因为 golang session.Run 方法里面会为这个命令打开一个匿名管道, 然后异步命令执行后, 父进程退出, 将匿名管道退出, 子进程收到匿名管道退出的信号,结果退出了.


strace排查异步shell执行失败问题.md
https://abrance.github.io/2024/08/07/project/宝贵经验/strace排查异步shell执行失败问题/
Author
xiaoy
Posted on
August 7, 2024
Licensed under