Why is the exec command output exceeding 65536
truncated when exec.Cmd.Stdout
and cmd.Stderr
point to the same bytes.Buffer
like below?
package main
import (
"bytes"
"encoding/json"
"os"
"os/exec"
"k8s.io/klog/v2"
)
func main() {
klog.Infof("==============1==================")
args := []string{"bucket", "stats"}
execCmd := exec.Command("radosgw-admin", args...)
f, err := os.Create("xxxx")
if err != nil {
panic(err)
}
execCmd.Stdout = f
err = execCmd.Run()
if err != nil {
panic(err)
}
f.Close()
bs, err := os.ReadFile("xxxx")
if err != nil {
panic(err)
}
klog.Infof("exec.Command(radosgw-admin bucket stats), length: %d", len(bs))
klog.Infof("==============2==================")
execCmd = exec.Command("radosgw-admin", args...)
var b bytes.Buffer
execCmd.Stdout = &b
err = execCmd.Run()
if err != nil {
panic(err)
}
klog.Infof("exec.Command(radosgw-admin bucket stats), length: %d", b.Len())
klog.Infof("==============3==================")
execCmd = exec.Command("radosgw-admin", args...)
var b2 bytes.Buffer
execCmd.Stdout = &b2
execCmd.Stderr = &b2 // <== here
err = execCmd.Run()
if err != nil {
panic(err)
}
klog.Infof("exec.Command(radosgw-admin bucket stats), length: %d", b2.Len())
klog.Infof("==============4==================")
execCmd = exec.Command("radosgw-admin", args...)
f, err = os.Create("yyyy")
if err != nil {
panic(err)
}
execCmd.Stdout = f
execCmd.Stderr = f
err = execCmd.Run()
if err != nil {
panic(err)
}
f.Close()
bs2, err := os.ReadFile("yyyy")
if err != nil {
panic(err)
}
klog.Infof("exec.Command(radosgw-admin bucket stats), length: %d", len(bs2))
klog.Infof("==============5==================")
execCmd = exec.Command("radosgw-admin", args...)
var b3 bytes.Buffer
var b4 bytes.Buffer
execCmd.Stdout = &b3
execCmd.Stderr = &b4
err = execCmd.Run()
if err != nil {
panic(err)
}
klog.Infof("exec.Command(radosgw-admin bucket stats), length: %d, err: %d", b3.Len(), b4.Len())
}
The output:
root@node01:/# ./test
I1207 10:53:47.150299 57435 test.go:36] ==============1==================
I1207 10:53:48.800277 57435 test.go:56] exec.Command(radosgw-admin bucket stats), length: 404237
I1207 10:53:48.803742 57435 test.go:64] ==============2==================
I1207 10:53:50.421419 57435 test.go:73] exec.Command(radosgw-admin bucket stats), length: 404237
I1207 10:53:50.421446 57435 test.go:76] ==============3==================
I1207 10:53:52.537304 57435 test.go:86] exec.Command(radosgw-admin bucket stats), length: 65536
I1207 10:53:52.537343 57435 test.go:89] ==============4==================
I1207 10:53:55.030006 57435 test.go:108] exec.Command(radosgw-admin bucket stats), length: 404237
I1207 10:53:55.035473 57435 test.go:115] ==============5==================
I1207 10:53:58.429107 57435 test.go:126] exec.Command(radosgw-admin bucket stats), length: 404237, err: 0
root@node01:/# radosgw-admin bucket stats | wc -c
404237