【问题标题】:Execute an external command and return its output执行外部命令并返回其输出
【发布时间】:2019-03-17 15:53:42
【问题描述】:

我正在尝试执行 linux 命令并将输出转换为 int。这是我当前的代码:

package main

import (
    "os/exec"
    "os"
    "strconv"
    _"fmt"
    "log"
    "bytes"
)

func main(){

    cmd := exec.Command("ulimit", "-n")
    cmdOutput := &bytes.Buffer{}
    cmd.Stdout = cmdOutput
    err := cmd.Run()
    if err != nil {
      os.Stderr.WriteString(err.Error())
    }

    count, err := strconv.Atoi( string(cmdOutput.Bytes()) )
    if err != nil {
        log.Fatal(err)
    }

    if count <= 1024 {
        log.Fatal("This machine is not good for working!!!")
    }
}

这是我当前的错误:

2018/10/12 14:37:27 exec: "ulimit -n": 找不到可执行文件 $路径

我不明白这个错误是什么意思以及如何解决它。

【问题讨论】:

  • 你真正的代码可能是exec.Command("ulimit -n")(单参数),而不是exec.Command("ulimit", "-n")(多参数)。如果不指定绝对路径,操作系统总是在$PATH 列出的目录中查找程序(并且没有名为“uname -n”的程序,因此出现错误)。
  • 我用单个参数更改,并返回相同的错误 exec: "ulimit -n": executable file not found in $PATH2

标签: go


【解决方案1】:

Linux 中没有可以运行的ulimit 程序。

ulimit 是 shell 的内置函数。所以你需要运行一个 shell 并让 shell 运行它内部的 ulimit 命令。

cmd := exec.Command("/bin/sh", "-c" "ulimit -n")

您还必须从 ulimit 命令的输出中删除换行符,例如

count, err := strconv.Atoi( strings.Trim(string(cmdOutput.Bytes()),"\n"))

更好的选择是通过 go 中的系统调用 API 检索这些限制,请参阅 How to set ulimit -n from a golang program? - 接受的答案首先获取并打印当前限制。

【讨论】:

  • 在大多数系统上它既是内置的又是二进制的。试试type -P ulimit(我的机器上是/usr/bin/ulimit)。
  • 不在我的任何 ubuntu、fedora 或 centos 机器上
  • 有趣。它为我提供了 bash-4.4.23-1.fc28.x86_64 软件包。
  • @nos 它出现在我的 Fedora 28 机器上:which ulimit -> /usr/bin/ulimit
  • 是的,我猜 Fedora 或 bash 最近添加了它——但如果你从 shell 运行 ulimit,你仍然使用内置 shell 命令。但是,OP 没有该程序,否则 go 程序会起作用。 (不过,将 ulimit 作为程序听起来有点奇怪,如果您想更改/设置 ulimit,它不能作为单独的程序运行,因为 ulimit 仅适用于当前进程及其子进程。这就是为什么它是内置到 shell 中,因此 shell 可以更改自己的限制并将其应用于将来从该 shell 中运行的任何程序。)
猜你喜欢
  • 2011-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
相关资源
最近更新 更多