Mongodb 如何将exec函数的stdout通过管道传输到另一个函数的读取器中?
我正在尝试将标准输出从mongodump流式传输到s3。我已经掌握了S3任意长度流的语法,但是我不知道如何将这两个函数耦合起来。我不想在开始上传到S3之前处理整个mongodump命令。这就是我到目前为止所做的:Mongodb 如何将exec函数的stdout通过管道传输到另一个函数的读取器中?,mongodb,go,amazon-s3,Mongodb,Go,Amazon S3,我正在尝试将标准输出从mongodump流式传输到s3。我已经掌握了S3任意长度流的语法,但是我不知道如何将这两个函数耦合起来。我不想在开始上传到S3之前处理整个mongodump命令。这就是我到目前为止所做的: dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive") dumpCmd.Stdout = os.Stdout uploader :=
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
dumpCmd.Stdout = os.Stdout
uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
Body: dumpCmd.Stdout,
Bucket: aws.String("myBucket"),
Key: aws.String("myKey"),
})
if err != nil {
log.Fatalln("Failed to upload", err)
}
log.Println("Successfully uploaded to", result.Location)
您可以使用
io.Copy
方法(),该方法定义如下:
本币副本
func副本(dst写入程序、src读取器)(写入int64,错误)
将副本从src复制到dst,直到src上达到EOF或
发生错误。它返回复制的字节数和第一个字节数
复制时遇到错误(如果有)
成功的复制返回err==nil,而不是err==EOF。因为拷贝是
定义为从src读取直到EOF,它不处理从读取的EOF
作为要报告的错误
如果src实现WriterTo接口,则复制由
调用src.WriteTo(dst)。否则,如果dst实现ReaderFrom
接口,通过调用dst.ReadFrom(src)来实现副本
您可以使用
io.Copy
方法(),该方法定义如下:
本币副本
func副本(dst写入程序、src读取器)(写入int64,错误)
将副本从src复制到dst,直到src上达到EOF或
发生错误。它返回复制的字节数和第一个字节数
复制时遇到错误(如果有)
成功的复制返回err==nil,而不是err==EOF。因为拷贝是
定义为从src读取直到EOF,它不处理从读取的EOF
作为要报告的错误
如果src实现WriterTo接口,则复制由
调用src.WriteTo(dst)。否则,如果dst实现ReaderFrom
接口,通过调用dst.ReadFrom(src)来实现副本
使用将命令的输出连接到上载的输入
这里有一个棘手的问题,即上传程序,但管道不支持搜索。为了避免这种情况,将在管道周围创建一个包装器,以对上传程序隐藏Seek方法
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
// handle error
}
if err := dumpCmd.Start(); err != nil {
// handle error
}
// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
io.Reader
}{body}
uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
Body: bodyWrap,
Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
Key: aws.String("myKey"),
})
if err != nil {
log.Fatalln("Failed to upload", err)
}
if err := dumpCmd.Wait(); err != nil {
// handle error
}
log.Println("Successfully uploaded to", result.Location)
dumpCmd:=exec.Command(“mongodump”、“主机”、“端口”、“存档”)
正文,错误:=dumpCmd.StdoutPipe()
如果出错!=零{
//处理错误
}
如果错误:=dumpCmd.Start();呃!=零{
//处理错误
}
//包裹管道以对上载程序隐藏seek方法
包体:=struct{
读写器
}{body}
uploader:=s3manager.NewUploader(session.New(&aws.Config{Region:aws.String(“us-east-1”)}))
结果,错误:=uploader.Upload(&s3manager.UploadInput){
车身:裹身衣,
Bucket:aws.String(“net openwhere mongodb snapshots dev”),
Key:aws.String(“myKey”),
})
如果出错!=零{
log.Fatalln(“上传失败”,错误)
}
如果错误:=dumpCmd.Wait();呃!=零{
//处理错误
}
log.Println(“已成功上载到”,result.Location)
使用a将命令的输出连接到上传的输入
这里有一个棘手的问题,即上传程序,但管道不支持搜索。为了避免这种情况,将在管道周围创建一个包装器,以对上传程序隐藏Seek方法
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
// handle error
}
if err := dumpCmd.Start(); err != nil {
// handle error
}
// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
io.Reader
}{body}
uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
Body: bodyWrap,
Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
Key: aws.String("myKey"),
})
if err != nil {
log.Fatalln("Failed to upload", err)
}
if err := dumpCmd.Wait(); err != nil {
// handle error
}
log.Println("Successfully uploaded to", result.Location)
dumpCmd:=exec.Command(“mongodump”、“主机”、“端口”、“存档”)
正文,错误:=dumpCmd.StdoutPipe()
如果出错!=零{
//处理错误
}
如果错误:=dumpCmd.Start();呃!=零{
//处理错误
}
//包裹管道以对上载程序隐藏seek方法
包体:=struct{
读写器
}{body}
uploader:=s3manager.NewUploader(session.New(&aws.Config{Region:aws.String(“us-east-1”)}))
结果,错误:=uploader.Upload(&s3manager.UploadInput){
车身:裹身衣,
Bucket:aws.String(“net openwhere mongodb snapshots dev”),
Key:aws.String(“myKey”),
})
如果出错!=零{
log.Fatalln(“上传失败”,错误)
}
如果错误:=dumpCmd.Wait();呃!=零{
//处理错误
}
log.Println(“已成功上载到”,result.Location)
我已经看过几次了,但我是一个完全的新手,不知道如何实现它。实际上,我认为这根本解决不了我的问题。uploader函数已经可以复制一个读卡器了,但是我没有读卡器,我有一个writer(dumpCmd.Stdout),我已经看过几次了,但是我是一个完全的新手,不知道如何实现它,实际上我认为这根本解决不了我的问题。uploader函数已经可以复制读卡器了,但是我没有读卡器,我有一个编写器(dumpCmd.Stdout),谢谢,这让我更接近于工作代码。新信息:上传程序在收到任何数据之前退出。我得到了一个0字节的文件,而预期大约600字节Meg@smiller171上传者报告的错误是什么?无错误:“2016/03/10 12:56:42成功上传到”我想是我的错误,一秒钟谢谢,让我更接近工作代码。新信息:上传程序在收到任何数据之前退出。我得到了一个0字节的文件,而预期大约600字节Meg@smiller171上传者报告的错误是什么?无错误:“2016/03/10 12:56:42成功上传到”“我认为这是我的错,一秒钟。”
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
// handle error
}
if err := dumpCmd.Start(); err != nil {
// handle error
}
// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
io.Reader
}{body}
uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
Body: bodyWrap,
Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
Key: aws.String("myKey"),
})
if err != nil {
log.Fatalln("Failed to upload", err)
}
if err := dumpCmd.Wait(); err != nil {
// handle error
}
log.Println("Successfully uploaded to", result.Location)