2017-06-27 17:42
浏览 340

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)

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

Running the command from the console works perfectly:

root@c8927c4a456e:/go/src/ 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/ echo $PATH

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

图片转代码服务由CSDN问答提供 功能建议


   command:= exec.Command(“ pidof tor | xargs kill -HUP”)
 command.Dir =“ / bin” 
如果cmdOut,err:= command.CombinedOutput();  err!= nil {


  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 [运行]中找不到可执行文件:
 /usr/local/go/src/runtime/panic.go:500 + 0x1a1  
 /usr/local/go/src/log/log.go:320 + 0xc9 
 \  n 


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

这是我的$ PATH

  root @ c8927c4a456e:/go/src/ echo $ PATH 
 / go / bin:/ usr / local / go / bin:/  usr / local / sbin:/ usr / local / bin:/ usr / sbin:/ usr / bin:/ sbin:/ bin 

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

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • douyu5775 2017-06-27 17:44

    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")
    打赏 评论

相关推荐 更多相似问题