英文:
Golang exec: stat: no such file or directory after file has been moved there
问题
我有一个脚本,我正在使用"os/exec"包进行部署。我使用的其中一个命令如下:
cpInit = exec.Command("cp", "initScripts/nginx", "/etc/init.d/nginx")
还有另一个命令:
startNginx = exec.Command("/etc/init.d/nginx", "start")
最初,我使用err := cpInit.Run()运行第一个命令,但是后来当我运行第二个命令时,我收到了错误信息:
exec: "/etc/init.d/nginx": stat /etc/init.d/nginx: 没有那个文件或目录
但是当程序退出时,/etc/init.d/nginx是存在的,所以我想也许第一个命令没有完成(即使Run()会等待命令返回)。我将Run()更改为Start()和Wait(),但结果相同。有人可以告诉我为什么第二个命令找不到那个文件吗?
英文:
I have a script that I am using for deployment using the "os/exec" package. One of the commands that I use is as follows:
cpInit = exec.Command("cp", "initScripts/nginx", "/etc/init.d/nginx")
and another:
startNginx = exec.Command("/etc/init.d/nginx", "start")
Initially I ran the first command with err := cpInit.Run(), but later when I run the second command I get the error:
exec: "/etc/init.d/nginx": stat /etc/init.d/nginx: no such file or directory
But when the program exits /etc/init.d/nginx is there, so I thought maybe the first command didn't finished (even though Run() waits until the command returns). I changed Run() to Start() and Wait() only to get the same results. Can anyone tell me why the second command can't find that file?
答案1
得分: 5
当你运行exec.Command(...)时,它会立即检查文件是否存在,但必须推迟错误直到你调用Run(),因为Command()调用不会返回错误。
在这里可以看到Command的定义:http://golang.org/src/pkg/os/exec/exec.go?s=3410:3455#L99
它调用了这里定义的LookPath(...):http://golang.org/src/pkg/os/exec/lp_unix.go?s=902:944#L23
在调用复制命令的Run()之后,你需要在确认文件存在之后初始化Command。
英文:
When you run exec.Command(...) it immediately goes and checks for the file's existence, but has to defer the error until you call Run(), because the Command() call doesn't return an error.
See here for the definition of Command: http://golang.org/src/pkg/os/exec/exec.go?s=3410:3455#L99
It calls LookPath(...) defined here: http://golang.org/src/pkg/os/exec/lp_unix.go?s=902:944#L23
You need to initialize the Command after you know the file is there--after calling Run() on your copy command.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论