执行:在$PATH中找不到可执行文件。

huangapple go评论83阅读模式
英文:

exec: executable file not found in $PATH

问题

我正在尝试在Go中向Tor发送HUP信号。

command := exec.Command("pidof tor | xargs kill -HUP")
command.Dir = "/bin"

if cmdOut, err := command.CombinedOutput(); err != nil {
    log.Panic("There was an error running HUP ", string(cmdOut), err)
    panic(err)
}

我尝试了多个版本(带参数/不带参数,带目录/不带目录...),但始终返回相同的错误:

2017/06/27 13:36:31 There was an error running HUP exec: "pidof tor | xargs kill -HUP": executable file not found in $PATH
panic: There was an error running HUP exec: "pidof tor | xargs kill -HUP": executable file not found in $PATH

goroutine 1 [running]:
panic(0x639ac0, 0xc42000d260)
        /usr/local/go/src/runtime/panic.go:500 +0x1a1
log.Panic(0xc420049f08, 0x3, 0x3)
        /usr/local/go/src/log/log.go:320 +0xc9
main.main()

从控制台运行该命令完全正常:

root@c8927c4a456e:/go/src/github.com/project# pidof tor | xargs kill -HUP
Jun 27 13:40:07.000 [notice] Received reload signal (hup). Reloading config and resetting internal state.
Jun 27 13:40:07.000 [notice] Read configuration file "/etc/tor/torrc".

这是我的$PATH:

root@c8927c4a456e:/go/src/github.com/project# echo $PATH
/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

我之前用git命令做过类似的操作,而且一切正常。我是否漏掉了什么?

英文:

I am trying to send the HUP signal to tor in Go.

	command := exec.Command("pidof tor | xargs kill -HUP")
	command.Dir = "/bin"

	if cmdOut, err := command.CombinedOutput(); err != nil {
		log.Panic("There was an error running HUP ", string(cmdOut), err)
		panic(err)
	}

I've tried numerous version of this (with/out args, with/out the Dir, ...) and it always comes back with the same error:

2017/06/27 13:36:31 There was an error running HUP exec: "pidof tor | xargs kill -HUP": executable file not found in $PATH
panic: There was an error running HUP exec: "pidof tor | xargs kill -HUP": executable file not found in $PATH

goroutine 1 [running]:
panic(0x639ac0, 0xc42000d260)
        /usr/local/go/src/runtime/panic.go:500 +0x1a1
log.Panic(0xc420049f08, 0x3, 0x3)
        /usr/local/go/src/log/log.go:320 +0xc9
main.main()

Running the command from the console works perfectly:

root@c8927c4a456e:/go/src/github.com/project# pidof tor | xargs kill -HUP
Jun 27 13:40:07.000 [notice] Received reload signal (hup). Reloading config and resetting internal state.
Jun 27 13:40:07.000 [notice] Read configuration file "/etc/tor/torrc".

Here's my $PATH

root@c8927c4a456e:/go/src/github.com/project# echo $PATH
/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

I've done this previously with git command and it was working seamlessly. Am I missing something ?

答案1

得分: 48

根据文档,传递给exec.Command的第一个参数是可执行文件的名称 - 就是这样。它不会被Shell解释;它是你想要派生的可执行文件的名称。如果你需要传递参数,你可以将它们作为额外的参数传递给Command,或者在返回的对象之后传递它们。

在你的情况下,你正在使用两个命令,并将一个命令的标准输出导入到另一个命令的标准输入。你可以在纯Go中实现这一点(将一个命令的标准输出读取器导入到另一个命令的标准输入写入器),或者你可以依赖Shell来完成。在后一种情况下,你的可执行文件将是shbash,参数将是["-c", "pidof tor | xargs kill -HUP"]。例如:

cmd := exec.Command("bash", "-c", "pidof tor | xargs kill -HUP")
英文:

Per the documentation, the first argument passed to exec.Command is the name of an executable - that's it. It's not interpreted by the shell; it's the name of an executable you want to fork. If you need to pass in arguments, you can pass them in as additional parameters to Command, or you can pass them to the returned object afterward.

In your case, you're using two commands and piping the stdout of one to the stdin of another. You could do this in pure Go (piping the Stdout reader of one to the Stdin writer of the other), or you could rely on the shell to do it. In the latter case, your executable would be sh or bash, and the arguments would be ["-c", "pidof tor | xargs kill -HUP"]. For example:

cmd := exec.Command("bash", "-c", "pidof tor | xargs kill -HUP")

huangapple
  • 本文由 发表于 2017年6月28日 01:42:06
  • 转载请务必保留本文链接:https://go.coder-hub.com/44786643.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定