2016-06-06 27 views
6

Ho un problema quando provo a recuperare un processo in go. La mia app di go lancia un sacco di processi e quando si blocca i processi sono disponibili all'apertura e quando rieseguo la mia app voglio recuperare i miei processi. Su Windows tutto funziona come previsto Posso wait() sul processo kill() ecc. Ma in Linux va semplicemente attraverso il mio wait() senza alcun errore. Ecco il codiceos.Process.Wait() dopo os.FindProcess (pid) funziona su Windows non su linux

func (proc *process) Recover() { 

    pr, err := os.FindProcess(proc.Cmd.Process.Pid) 

    if err != nil { 
     return 
    } 

    log.Info("Recovering " + proc.Name + proc.Service.Version) 

    Processes.Lock() 
    Processes.Map[proc.Name] = proc 
    Processes.Unlock() 
    proc.Cmd.Process = pr 

    if proc.Service.Reload > 0 { 
     proc.End = make(chan bool) 
     go proc.KillRoutine() 
    } 

    proc.Cmd.Wait() 

    if proc.Status != "killed" { 
     proc.Status = "finished" 
    } 
    proc.Time = time.Now() 


    channelProcess <- proc 

    //confirmation that process was killed 
    if proc.End != nil { 
     proc.End <- true 
    } 

} 

processo è la mia struttura per gestire i processi la parte importante è CMD che è dal pacchetto "os/exec" ho anche provato a chiamare direttamente pr.wait() con lo stesso problema

risposta

4

Sei non consegnando il messaggio di errore da Wait. Prova:

ps, err := proc.Cmd.Wait() 
if err != nil { 
    /* handle it */ 
} 

anche the documentation dice:

attese attendere che il processo per uscire, e quindi restituisce una ProcessState che descrive il suo stato e un errore, se presente. Attende rilascia qualsiasi risorsa associata al processo. Nella maggior parte dei sistemi operativi, il processo deve essere un figlio del processo corrente o un errore sarà restituito.

Nel tuo caso da quando "stai recuperando", il tuo processo non è il genitore dei processi che hai trovato usando os.FindProcess.

Quindi perché funziona su Windows? Sospetto che sia dovuto al fatto che lo on windows si riduce a WaitForSingleObject che non ha questo requisito.

+0

Oh, giusto, stavo gestendo l'errore del proc (in un'altra routine) ma non sull'attesa effettiva. Hai qualche suggerimento su come posso recuperare un processo che è, di fatto, non più un bambino? – Lomithrani

+0

@Lomithrani Potrei avere alcuni suggerimenti. Cosa stai cercando di fare con il processo dopo averlo "recuperato"? Inoltre, anticipando la mia prossima domanda: se fai qualche passo indietro: che problema stai cercando di risolvere? – cnicutar

+0

Il mio programma gestisce i programmi (ma poichè è il mio primo programma go, potrebbe talvolta andare in panico). Posso vedere quali programmi sono in esecuzione, ecc. In sostanza ho bisogno di sapere se corrono ed essere in grado di ucciderli e sapere quando si bloccano. solo monitorare i processi e non eseguirli direttamente significa ripetere da zero tutte le mie app. Funziona come voglio su Windows è piuttosto frustrante non poter fare lo stesso su linux :(Ho pensato di creare un altro processo per gestire i processi se la mia app si arresta in modo anomalo con PR_SET_CHILD_SUBREAPER e restituiscile nello stesso modo una volta che la mia app viene eseguita – Lomithrani