ようへいの日々精進XP

よかろうもん

俺の郷 〜 コマンドの実行結果を JSON で返す郷 〜

Golang を勉強中であります

以下の点について勉強しました

  • Golang で配列を含んだ JSON の生成について
  • Golang でコマンドの実行と結果の取得方法

出来たもの

gist.github.com

以下のように使う

環境

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G1421

$ go version
go version go1.8.3 darwin/amd64

ヘルプ

$ ./cmdRunner -help
Usage of ./cmdRunner:
  -command string
        Specify a Command.
  -interval int
        Specify a Wait Interval Times. (default 3)
  -times int
        Specify a Loop Counts Number. (default 1)

date を 1 秒毎に 5 回実行

$ ./cmdRunner -command="date +%Y%m%d-%H:%M:%S" -times=5 -interval=1 | jq .
{
  "outputs": [
    "20170718-07:56:55",
    "20170718-07:56:56",
    "20170718-07:56:57",
    "20170718-07:56:58",
    "20170718-07:56:59"
  ]
}

date を 3 秒ごとに 3 回実行

$ ./cmdRunner -command="date +%Y%m%d-%H:%M:%S" -times=3 -interval=3 | jq .
{
  "outputs": [
    "20170718-07:57:54",
    "20170718-07:57:57",
    "20170718-07:58:00"
  ]
}

まとめ

コマンドの実行(実行結果もしくは実行エラーも取得したい場合)

CombinedOutput() を利用すると良いらしい。

func runCommand(command string) (output string){
    cmd := exec.Command("sh", "-c", command)
    stdout, err := cmd.CombinedOutput()
    output = strings.TrimRight(string(stdout), "\n")
    if err != nil {
        errMessage := err.Error() + ": " + output
        log.Printf(string(errMessage))
        return output
    }
    return output
}

配列を含んだ JSON の生成

// 配列を含んだ JSON の構造体を定義
type OutputMessages struct {
    Outputs []string    `json:"outputs"`
}

...
// JSON オブジェクトを生成
outputMessage := OutputMessages{Outputs: []string(stdouts)}

// Marshal 関数を利用して JSON を生成
jsonBytes, err := json.Marshal(outputMessage)

以上

メモでした。