Передайте команду и перенаправьте вывод в golang с помощью команды - PullRequest
0 голосов
/ 17 ноября 2018

Вот мой код:

package main

import (
    "fmt"
    "os"
    "os/exec"
    "strconv"
    "time"
)

func main() {
    year, month, day := time.Now().Date()
    monthI := int(month)
    fmt.Println("toto")
    date := strconv.Itoa(year)+"_"+strconv.Itoa(monthI)+"_"+strconv.Itoa(day)
    nameSnapshot := "storedb@backup_"+date
    args := []string{"snapshot",nameSnapshot}
    cmd := exec.Command("zfs", args...)
    err := cmd.Run()
    if err != nil {
        os.Stderr.WriteString(err.Error())
    }
    args = []string{"send",nameSnapshot,"|","gzip",">","backup_"+date+".gz"}
    cmd = exec.Command("zfs", args...)
    err = cmd.Run()
    if err != nil {
        os.Stderr.WriteString(err.Error())
    }


}

Я хотел бы сделать это одной командой.

Моя вторая строка команды zfs send, похоже, не работает.

Как передать и перенаправить вывод в golang с cmd.exec?

С уважением

1 Ответ

0 голосов
/ 17 ноября 2018

Это упрощенная версия того, как вы могли бы достичь этого:

outfile, _ := os.OpenFile("backup.gz", os.O_RDWR|os.O_CREATE, 0755)

// your zfs command
zfs := exec.Command("zfs", "send", "storedb@backup")
gzip := exec.Command("gzip", "-cf") // gzip to stdout (-cf)
gzip.Stdin, _ = zfs.StdoutPipe()    // zfs stdout to gzip stdin
gzip.Stdout = outfile               // write output of gzip to outfile
gzip.Start()                        // gzip start waiting for input
zfs.Run()                           // zfs start command
gzip.Wait()                         // gzip wait for pipe to close
outfile.Close()

Это эквивалентно этой команде в оболочке:

zfs send stored@backup | gzip -cf > backup.gz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...