2017-07-28 5 views
0

Bonjour, Je travaille sur un code simple qui surveille un processus et redémarre le processus au cas où le processus se bloque. J'ai écrit un petit exemple de code.Attendre la fin d'un processus non-fils

Ceci est mon processus externe

package main 

import (
    "fmt" 
    "time" 
) 

func main() { 
    for { 
     time.Sleep(1000 * time.Millisecond) 
     fmt.Println("hello") 
    } 
} 

Ceci est le code qui le surveille.

package main 

import (
    "fmt" 
    "os" 
) 

func main() { 
    p, e := os.FindProcess(<processid>) 
    fmt.Println(e) 
    fmt.Println(p.Wait()) 
    fmt.Println("done") 
} 

Le défi est ici que depuis le premier processus est pas un processus enfant du second, il n'attend pas et sort directement. S'il vous plaît laissez-moi savoir si quelqu'un a des idées à ce sujet.

Merci.

+0

Avez-vous essayé d'utiliser go-ps? https://github.com/mitchellh/go-ps Ou gops? https://github.com/google/gops – pltvs

Répondre

0

La surveillance des sorties de processus car p.Wait() ne bloque pas.

De l'docs:

Sur la plupart des systèmes d'exploitation, le processus doit être un enfant du processus en cours ou une erreur est renvoyée.

Vous pouvez peut-être interroger le pool de processus pour vérifier si le processus existe toujours.

+0

Connaissez-vous un mécanisme d'interrogation, les tuyaux est une façon de faire, mais souhaitez mettre en œuvre une solutiom moins compliquée – Pharaoh

+0

Vous pouvez essayer l'un des packages répertoriés dans le commentaire ci-dessus. Par exemple, utilisez go-ps et une boucle vérifie par intermittence l'exécutable du processus pour voir si le processus est toujours en cours d'exécution. Les pipes peuvent être compliquées mais elles seront une meilleure solution. – abhink