web-dev-qa-db-fra.com

exec: fichier exécutable introuvable dans $ PATH

J'essaie d'envoyer le signal HUP à tor dans 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)
    }

J'en ai essayé de nombreuses versions (avec/sans arguments, avec/sans Dir, ...) et ça revient toujours avec la même erreur:

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

L'exécution de la commande à partir de la console fonctionne parfaitement:

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

Voici mon $ 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

J'ai déjà fait cela avec la commande git et cela fonctionnait parfaitement. Suis-je en train de manquer quelque chose?

8
Mathieu Nls

Selon la documentation , le premier argument passé à exec.Command est le nom d'un exécutable - c'est tout. Ce n'est pas interprété par le Shell; c'est le nom d'un exécutable que vous souhaitez fork. Si vous avez besoin de passer des arguments, vous pouvez les passer en tant que paramètres supplémentaires à Command, ou vous pouvez les passer au retour objet après.

Dans votre cas, vous utilisez deux commandes et canalisez la sortie standard de l'une vers la sortie standard d'un autre. Vous pouvez le faire en pure Go (canalisation du lecteur Stdout de l'un vers l'écrivain Stdin de l'autre), ou vous pouvez compter sur le Shell pour le faire. Dans ce dernier cas, votre exécutable serait sh ou bash, et les arguments seraient ["-c", "pidof tor | xargs kill -HUP"]. Par exemple:

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