英文:
Can't access filesystem in Go Lambda
问题
我之前使用过Lambda函数,如果我没记错的话,我应该有大约500MB的(临时)空间在/tmp
目录下。
然而,我的Go Lambda函数似乎无法正确地与文件系统进行交互:
exec.Command("ls -la /").Output()
返回空值
exec.Command("rm -rf /tmp/xxx").Run()
返回 fork/exec: 没有那个文件或目录
exec.Command("mkdir -p /tmp/xxx").Run()
返回 fork/exec: 没有那个文件或目录
这真的很奇怪。
它正在使用go1.x环境(因此,我猜是amazonlinux:2)。
更新
我可以使用Go的os函数访问文件系统:
os.RemoveAll("/tmp/xxx")
if _, err := os.Stat("/tmp/xxx"); os.IsNotExist(err) {
if err := os.Mkdir("/tmp/xxx", os.ModePerm); err != nil {
return err
}
}
但是我真的需要使用exec来运行之后的二进制命令,并在那个tmp文件夹中写入文件。在这种情况下,错误是相同的(没有那个文件或目录)。尽管我刚刚用上述命令创建了文件夹。
英文:
I used Lambda functions before, and if I remember correctly I'm supposed to have ~500Mb of (ephemeral) space in /tmp
.
Nevertheless, my Go lambda function doesn't seem to interact with the fs properly:
exec.Command("ls -la /").Output()
returns empty
exec.Command("rm -rf /tmp/xxx").Run()
returns fork/exec : no such file or directory
exec.Command("mkdir -p /tmp/xxx").Run()
returns fork/exec : no such file or directory
It's really weird.
It's using the go1.x environment (thus, I guess amazonlinux:2)
UPDATE
I CAN access the fs using Go os functions:
os.RemoveAll("/tmp/xxx")
if _, err := os.Stat("/tmp/xxx"); os.IsNotExist(err) {
if err := os.Mkdir("/tmp/xxx", os.ModePerm); err != nil {
return err
}
}
BUT I really need exec to run afterwards (a binary command), and write a file in that tmp folder. The error in that case is the same (no such file or directory). Even though I've just created the folder with the above commands.
答案1
得分: 5
你离答案很近了。你使用exec.Command()
的方式还不完全正确。尝试以下代码:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
o, err := exec.Command("ls", "-la", "/tmp").Output()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%s\n", o)
}
Command()
的第一个参数是你想要运行的程序,后面的参数是程序的参数。
参考链接:https://play.golang.org/p/WaVOU0IESmZ
英文:
You are close. The way you use exec.Command()
is not yet 100% correct. Try the following:
package main
import (
"fmt"
"os"
"os/exec"
)
func main() {
o, err := exec.Command("ls", "-la", "/tmp").Output()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
fmt.Printf("%s\n", o)
}
The first argument to Command()
is the program you want to run and all the following arguments are the programs arguments.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论