英文:
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来完成。在后一种情况下,你的可执行文件将是sh
或bash
,参数将是["-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")
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论