Mac(darwin/amd64)下Go 1.10.2执行fork/exec报错:文件不存在
解决Go中fork/exec "No such file or directory"错误的建议
我来帮你排查这个问题,从你的代码来看,主要是exec.Command的使用方式有误,还有几个细节需要调整,具体如下:
1. 修复exec.Command的调用方式
你现在把整个命令字符串作为第一个参数传给exec.Command,但这个函数的设计是第一个参数是可执行文件路径,后面依次是独立的命令行参数。你当前的写法会让Go尝试去执行一个名为"./goreplay --input-file xxx..."的文件,显然这个文件不存在,所以才会报"No such file or directory"。
正确的写法应该拆分命令和参数:
cmd := exec.Command("./goreplay", "--input-file", gor_name, "--input-file-loop", "--output-http", ras_ip)
2. 修正fmt.Printf的占位符问题
你的代码里这两行printf没有使用占位符,导致变量a和c的值根本不会被打印出来,没法帮你排查路径和命令是否正确:
// 错误写法 fmt.Printf("当前路径为", a) fmt.Printf("c: ", c) // 正确写法,加上%s占位符和换行符 fmt.Printf("当前路径为%s\n", a) fmt.Printf("c: %s\n", c)
3. 验证路径与可执行文件的有效性
- 先确认
search_path()返回的路径是否正确,同时检查os.Chdir(a)的返回值,如果不是nil,说明切换目录失败了,这也会导致找不到./goreplay。 - 手动在终端切换到
search_path()返回的目录,执行./goreplay --version,确认这个文件存在且有可执行权限(如果没有权限,执行chmod +x goreplay添加权限)。
4. 添加调试日志捕获输出
如果还是有问题,可以捕获命令的标准输出和错误输出,这样能更清楚看到执行时的问题:
import "bytes" // ... var stdout, stderr bytes.Buffer cmd.Stdout = &stdout cmd.Stderr = &stderr err := cmd.Run() if err != nil { log.Fatalf("命令执行失败: %v\n标准输出: %s\n错误输出: %s", err, stdout.String(), stderr.String()) }
按照这些步骤调整后,应该就能解决这个fork/exec的错误了。
内容的提问来源于stack exchange,提问作者xiang tianyu
相关产品推荐
相关产品推荐

