英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论