问题描述
我正在尝试使用golang调用systemd-coredump程序以生成核心转储,但是它以某种原因失败,并显示no such file or directory
错误。
我正在将这段代码容器化,并将其部署为kubernetes中的Pod。
Kubernetes具有rhel 7.6版
这是我的代码:
package main
import (
"os/exec"
"os"
"fmt"
)
func main(){
coreProcessID := "<some process id>"
partialCmd := "<arguments for core dump like %u %g %s %t %c %E>"
coreCmd := "/usr/lib/systemd/systemd-coredump " + coreProcessID + " " + partialCmd
fmt.Println("coreCmd is ",coreCmd)
cmd := exec.Command(coreCmd)
output,err := cmd.CombinedOutput()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + string(output))
} else {
fmt.Println(string(output))
}
}
我收到此错误:fork/exec /usr/lib/systemd/systemd-coredump 59009 %u %g %s %t %c %E: no such file or directory:
我什至尝试使用syscall.Exec
,但它只是退出程序而没有任何错误或输出。
在Python中,使用os.system(core_cmd)
可以很好地工作,但对于golang则以某种方式失败。
如何使用golang调用systemd-coredump程序?
尝试以下更改
cmd := exec.Command(coreCmd,coreProcessID,partialCmd)
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
}
fmt.Println("Result: " + out.String())
但是它不会检索输出或生成核心转储
解决方法
如果像这样想象,您的原始示例在某种程度上可以工作
import (
"fmt"
"os"
"os/exec"
"strings"
)
func main() {
coreProcessID := os.Args[1]
partialCmd := "%u %g %s %t %c %E"
coreCmdArgs := coreProcessID + " " + partialCmd
fmt.Println("coreCmdArgs are ",coreCmdArgs)
coreCmdArgsAsSlice := strings.Split(" ",coreCmdArgs)
cmd := exec.Command("/usr/lib/systemd/systemd-coredump",coreCmdArgsAsSlice...)
output,err := cmd.CombinedOutput()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + string(output))
} else {
fmt.Println(string(output))
}
}
我系统上的上述内容给出了此错误,这大概是由于systemd-coredump的工作方式
coreCmdArgs are 885 %u %g %s %t %c %E
exit status 1: Not enough arguments passed by the kernel (1,expected 6).