go build command-line-arguments: copying /tmp/go-build042781492/b001/exe/a.out: open main: text file

今天在 build 命令源码文件 main.go 的时候,报如错误:

go build command-line-arguments: copying /tmp/go-build042781492/b001/exe/a.out: open main: text file busy

意思很明显,build 完成之后将编译后的文件覆盖之前生成的可执行文件 main 的时候,发现main文件被占用了,并且没有释放,无法覆盖。

因为我已经把 main 运行起来了,然后我修改了代码,重新 build 时出现的问题,按道理说应该不会出现这种问题的,想来想去,因为我用的时虚拟机+共享文件夹的形式运行的linux,之前就被这套文件系统坑过,此次事故大概率也是这个问题。

我先在windows上做测试。

package main

import (
	"fmt"
	"time"
)

func main() {
     
	time.Sleep(30*time.Second)
	fmt.Println("2")
}

要测试的东西是:在一个可执行文件正在运行时,修改代码,看能否编译成功并覆盖掉原来的可执行文件。

go build main.go

运行文件 main.exe

修改代码 fmt.Println(“3”)

新窗口 go build main.go

发现编译通过了,没报错,运行之 main.exe

结果是,第一个输出2,第二个输出3,证明是正常的。

于是,回到linux上,在共享目录之外的地方创建测试代码,我的共享目录是 /data/www/

cd /data

mkdir test

cd test

go mod init test

vi main.go

输入上面的测试代码

执行同样的测试步骤,发现也是正常的,看来这个原因就是虚拟机共享目录导致的。

你可能感兴趣的:(golang)