2013-01-02 12 views
11

Sto cercando di scrivere un programma Python per testare un server scritto in C. Il programma Python lancia il server compilato utilizzando il modulo subprocess:Uccidere quando si blocca madri in pitone

pid = subprocess.Popen(args.server_file_path).pid 

Questo funziona bene, tuttavia se il programma python termina in modo imprevisto a causa di un errore, il processo spawn viene lasciato in esecuzione. Ho bisogno di un modo per assicurarmi che se il programma python si chiude inaspettatamente, anche il processo del server viene ucciso.

Alcuni dettagli:

  • Linux o sistemi operativi OSX solo
  • codice
  • Server non può essere modificato in alcun modo
+0

"a causa di un errore" - Che tipo di errore? – mgilson

+0

Errori di rete, interrupt di tastiera, ecc. – charliehorse55

+1

[supervisor] (http://supervisord.org/) è un demone di gestione dei processi open-source scritto in Python. Il codice sorgente potrebbe valere la pena dare un'occhiata se ne hai il tempo. –

risposta

19

avrei atexit.register una funzione per terminare il processo:

import atexit 
process = subprocess.Popen(args.server_file_path) 
atexit.register(process.terminate) 
pid = process.pid 

Oppure:

import atexit 
process = subprocess.Popen(args.server_file_path) 
@atexit.register 
def kill_process(): 
    try: 
     process.terminate() 
    except OSError: 
     pass #ignore the error. The OSError doesn't seem to be documented(?) 
      #as such, it *might* be better to process.poll() and check for 
      #`None` (meaning the process is still running), but that 
      #introduces a race condition. I'm not sure which is better, 
      #hopefully someone that knows more about this than I do can 
      #comment. 

pid = process.pid 

Si noti che questo non ti aiuta se fai qualcosa di brutto per provocare pitone a morire in modo non elegante (per esempio via os._exit o se si causa un SegmentationFault o BusError)

+0

@ire_and_curses - Grazie per aver aggiunto il collegamento. è apprezzato – mgilson

+1

il "caso cattivo" è il più interessante) – vak

+0

offro un'opzione per il "caso brutto" in http://stackoverflow.com/questions/25542110/kill-child-process-if-parent-is-killed- in-python/25634723 # 25634723, ma non aiuta qui (richiede l'accesso al codice sorgente del client). –

Problemi correlati