web-dev-qa-db-ja.com

exec:$ 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コマンドで実行しており、シームレスに機能していました。私は何かが欠けていますか?

8
Mathieu Nls

ドキュメントごとexec.Commandに渡される最初の引数は実行可能ファイルの名前です-それだけです。シェルによって解釈されません。フォークする実行可能ファイルの名前です。引数を渡す必要がある場合は、それらをadditionalパラメーターとしてCommandに渡すか、返された引数に渡すことができますその後オブジェクト。

あなたの場合、2つのコマンドを使用し、1つのstdoutを別のstdinにパイプしています。これを純粋なGo(一方のStdoutリーダーから他方のStdinライターにパイプする)で行うことも、Shellに依存して行うこともできます。後者の場合、実行可能ファイルはshまたはbashになり、引数は["-c", "pidof tor | xargs kill -HUP"]になります。例えば:

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