You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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,提问作者王文杰

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 06:24:22