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
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
@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
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