今天在 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 mainimport ("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
输入上面的测试代码
执行同样的测试步骤,发现也是正常的,看来这个原因就是虚拟机共享目录导致的。