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

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

问题描述:

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 ?

我正在尝试将HUP信号发送到Go中的tor。 p>

   command:= exec.Command(“ pidof tor | xargs kill -HUP”)
 command.Dir =“ / bin” 
 
如果cmdOut,err:= command.CombinedOutput();  err!= nil {
 log.Panic(“运行HUP时出错”,string(cmdOut),err)
 panic(err)
} 
  code>  pre> 
 
  

我尝试了很多版本(使用/不使用args,使用/不使用Dir,...),并且总是返回相同的错误: p>

  2017/06/27 13:36:31运行HUP exec时出错:“ pidof tor | xargs kill -HUP”:在$ PATH 
panic中找不到可执行文件:运行HUP exec时出错:“ pidof tor  | xargs kill -HUP“:在$ PATH 
 
goroutine 1 [运行]中找不到可执行文件:
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()
  code>  pre> 
 \  n 

从控制台运行命令非常正常: p>

  root @ c8927c4a456e:/go/src/github.com/project# pidof tor |  xargs kill -HUP 
Jun 27 13:40:07.000 [notice]收到重载信号(hup)。 重新加载配置并重置内部状态。
Jun 27 13:40:07.000 [notice]读取配置文件“ / etc / tor / torrc”。
  code>  pre> 
 
 

这是我的$ PATH p>

  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 
  code>  pre> 
 
 

我已经做到了 以前使用git命令,并且可以无缝工作。 我想念什么吗? p> div>

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