亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將 exec 函數的標準輸出通過管道傳輸到另一個函數的讀取器中?

如何將 exec 函數的標準輸出通過管道傳輸到另一個函數的讀取器中?

Go
斯蒂芬大帝 2021-12-20 16:37:46
我正在嘗試將標準輸出從 mongodump 流式傳輸到 s3。我已經正確掌握了 S3 任意長度流的語法,但我不明白如何耦合這兩個函數。我不想在開始上傳到 S3 之前處理整個 mongodump 命令。這是我到目前為止:dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")dumpCmd.Stdout = os.Stdoutuploader := 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)不幸的是 dumpCmd.Stdout 是作者,而不是讀者,我不知道如何將作者的輸出通過管道傳輸到讀者。使用管道后,我現在收到一個新錯誤,這可能屬于一個新問題: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}uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))result, err := uploader.Upload(&s3manager.UploadInput{    Body:   body,    Bucket: aws.String("myBucket"),    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)錯誤:2016/03/10 12:39:18 Failed to upload MultipartUpload: upload multipart failed    upload id: QOWW4jBHH4PKjs1Tloc8dlCTtFN94vDHIJIWJChsrjxLZggScZbRUhM4FU9V.xOnIg9uYnBWqOA1x1xqStfA1p8vdAOHNyUp4gOO5b1gbuXvUitQyLdfFhKg9MnyxsV1caused by: RequestError: send request failedcaused by: Put https://myBucket/myKey?partNumber=1&uploadId=QOWW4jBHH4PKjs1Tloc8dlCTtFN94vDHIJIWJChsrjxLZggScZbRUhM4FU9V.xOnIg9uYnBWqOA1x1xqStfA1p8vdAOHNyUp4gOO5b1gbuXvUitQyLdfFhKg9MnyxsV1: read |0: illegal seekexit status 1
查看完整描述

2 回答

?
MMTTMM

TA貢獻1869條經驗 獲得超4個贊

使用管道將命令的輸出連接到上傳的輸入。


這里的棘手問題是上傳者在 body上查找,但管道不支持查找。為了避免這種情況,在管道周圍創建了一個包裝器,以對上傳者隱藏 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)


查看完整回答
反對 回復 2021-12-20
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

您可以使用io.Copy方法 ( godoc ),其定義如下:

功能復制

func Copy(dst Writer, src Reader)(寫入int64,err錯誤)

將副本從 src 復制到 dst,直到在 src 上達到 EOF 或發生錯誤。它返回復制的字節數和復制時遇到的第一個錯誤(如果有)。

成功的復制返回 err == nil,而不是 err == EOF。因為 Copy 被定義為從 src 讀取直到 EOF,所以它不會將讀取的 EOF 視為要報告的錯誤。

如果 src 實現了 WriterTo 接口,則通過調用 src.WriteTo(dst) 來實現副本。否則,如果 dst 實現了 ReaderFrom 接口,則通過調用 dst.ReadFrom(src) 來實現副本。


查看完整回答
反對 回復 2021-12-20
  • 2 回答
  • 0 關注
  • 209 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號