首页 > 解决方案 > 使用 golang 调用 systemd-coredump 程序失败

问题描述

我正在尝试使用 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())

但它不会检索输出或生成核心转储

标签: linuxgokubernetesrhel

解决方案


如果像这样重新想象,您的原始示例在某种程度上有效

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).

推荐阅读