调用cmd.Start启动child.exe时,如何获取test.exe的命令行日志信息?
获取child.exe日志的解决方案
要拿到child.exe的命令行日志,因为父进程会立刻调用os.Exit()退出,没法直接通过父进程的管道持续捕获输出(父进程一退管道就断了),最稳妥的办法是把子进程的标准输出和错误输出直接重定向到文件——不管父进程存不存在,子进程的日志都会老老实实写到文件里。
代码示例(推荐方案)
// 父进程代码 package main import ( "os" "os/exec" ) func main() { // 创建日志文件,用来存child.exe的输出 logFile, err := os.Create("child.log") if err != nil { // 这里可以加错误处理逻辑,比如打印错误 return } defer logFile.Close() // 启动child.exe,把stdout和stderr都定向到日志文件 cmd := exec.Command("cmd", "/c", "./child.exe") cmd.Stdout = logFile cmd.Stderr = logFile if err := cmd.Start(); err != nil { // 处理启动失败的情况 return } // 父进程直接退出,子进程会继续跑并写日志到文件 os.Exit(0) }
备选方案(仅适用于子进程快速输出日志)
如果你的child.exe能很快输出完所有日志,也可以在父进程退出前用管道捞一波输出,但这种方式抓不到子进程后续的输出——因为父进程一退管道就关了:
// 仅适合子进程快速输出的场景 package main import ( "io" "os" "os/exec" ) func main() { cmd := exec.Command("cmd", "/c", "./child.exe") stdoutPipe, err := cmd.StdoutPipe() if err != nil { return } stderrPipe, err := cmd.StderrPipe() if err != nil { return } if err := cmd.Start(); err != nil { return } // 读取当前已输出的内容 stdout, _ := io.ReadAll(stdoutPipe) stderr, _ := io.ReadAll(stderrPipe) // 把读取到的内容写入文件 os.WriteFile("partial_child.log", append(stdout, stderr...), 0644) os.Exit(0) }
内容的提问来源于stack exchange,提问作者王文杰
相关产品推荐
相关产品推荐

