Golang exec:stat:文件被移动到那里后没有这样的文件或目录

Posted

技术标签:

【中文标题】Golang exec:stat:文件被移动到那里后没有这样的文件或目录【英文标题】:Golang exec: stat: no such file or directory after file has been moved there 【发布时间】:2013-12-31 03:12:14 【问题描述】:

我有一个使用“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: no such file or directory

但是当程序退出时/etc/init.d/nginx 就在那里,所以我想也许第一个命令没有完成(即使Run() 等到命令返回)。我将Run() 更改为Start()Wait() 只是为了得到相同的结果。谁能告诉我为什么第二个命令找不到那个文件?

【问题讨论】:

【参考方案1】:

当您运行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

您需要在知道文件存在后初始化Command - 在您的复制命令上调用Run() 之后。

【讨论】:

以上是关于Golang exec:stat:文件被移动到那里后没有这样的文件或目录的主要内容,如果未能解决你的问题,请参考以下文章

详解Linux——find命令(stat+exec+xargs+dd命令)

SQL sys.dm_exec_query_stats Last_Elapsed_Time 废话

如何用golang获取linux上文件的创建/修改时间

golang 在golang中管道exec.Cmd(示例按其扩展名对目录下的所有常规文件进行排序)

exec dbms_stats.gather_schema_stats 手动优化统计

在fsnotify上递归重新生成文件删除/重命名(Golang)