2016-09-15 1 views
5

Je veux exécuter une commande qui se met en arrière-plan (ou si cela rend les choses plus possibles, exécutez la commande en mode premier plan et arrière-plan moi-même), et obtenir le pid de le processus d'arrière-plan. Comment est-ce que je fais ceci dans Go? J'ai essayé:golang exec processus d'arrière-plan et obtenir son pid

cmd := exec.Command("ssh", "-i", keyFile, "-o", "ExitOnForwardFailure yes", "-fqnNTL", fmt.Sprintf("%d:127.0.0.1:%d", port, port), fmt.Sprintf("%[email protected]%s", serverUser, serverIP)) 
cmd.Start() 
pid := cmd.Process.Pid 
cmd.Wait() 

Cela renvoie ~ instantanément, les feuilles ssh en arrière-plan, mais pid est pas le pid du processus ssh actif (probablement son l'pid du processus ssh parent avant qu'il fourchue et backgrounded lui-même) .

Comment faire ceci correctement?

+0

Qu'entendez-vous par "arrière-plan"? Quand vous 'Start()' votre 'Cmd' vous avez déjà un processus fils séparé (avec le bon' Process.Pid') en cours d'exécution simultanément à votre application Go. Peut-être que vous avez juste besoin de retirer '-f' des drapeaux ssh? –

+1

J'ai besoin du processus pour continuer à fonctionner après la fermeture de mon processus. Je dois ensuite être en mesure de tuer le processus ssh en arrière-plan dans le futur, pour lequel j'ai besoin d'avoir stocké son pid. – sbs

+0

Hmm, en fait vous avez raison, le processus continue si je ne l'attends pas et quitte juste. – sbs

Répondre

9

Vous n'avez besoin de rien de spécial, ne dites pas ssh à l'arrière-plan lui-même et ne le faites pas Wait() pour cela. Exemple:

$ cat script.sh 
#!/bin/sh 
sleep 1 
echo "I'm the script with pid $$" 
for i in 1 2 3; do 
     sleep 1 
     echo "Still running $$" 
done 
$ cat proc.go 
package main 

import (
     "log" 
     "os" 
     "os/exec" 
) 

func main() { 
    cmd := exec.Command("./script.sh") 
    cmd.Stdout = os.Stdout 
    err := cmd.Start() 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Printf("Just ran subprocess %d, exiting\n", cmd.Process.Pid) 
} 
$ go run proc.go 
2016/09/15 17:01:03 Just ran subprocess 3794, exiting 
$ I'm the script with pid 3794 
Still running 3794 
Still running 3794 
Still running 3794 
+0

Bonjour, votre exemple fonctionne correctement mais le processus passe en mode 'S' après la fin. Y a-t-il un meilleur moyen d'atteindre les mêmes résultats? Où je peux obtenir un pid afin de vérifier si fini. Dans mon cas, je n'ai pas besoin de la sortie car il y aura déjà un fichier journal contenant les résultats si elle est terminée avec succès –

+0

Cela fonctionnera-t-il mieux si j'utilise la connexion ssh? –