2013-01-02 16 views
11

ebeveyn çöker ben piton programı subprocess modülü kullanarak derlenmiş sunucu başlattı C ile yazılmış bir sunucu test etmek için bir piton programı yazmak için çalışıyorum:Öldürme çocuk süreç piton

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

Bu iyi çalışır, Ancak, python programı bir hata nedeniyle beklenmedik bir şekilde sonlanırsa, ortaya çıkan işlem devam eder. Python programının beklenmedik bir şekilde çıkması durumunda, sunucu işleminin de öldürülmesinin sağlanması için bir yönteme ihtiyacım var.

Bazı daha fazla ayrıntı:

  • Linux veya OSX işletim sistemleri sadece
  • Sunucu kodu
+0

aracılığıyla "bir hata nedeniyle" - Ne tür bir hata? – mgilson

+0

Ağ hataları, Klavye kesme vb. – charliehorse55

+1

[süpervizör] (http://supervisord.org/) Python'da yazılmış açık kaynaklı bir süreç yönetim programıdır. Zamanınız varsa kaynak kodu bir göz atmaya değer olabilir. –

cevap

19

Ben atexit.register bir işlev sürecini sonlandırmak için herhangi bir şekilde değiştirilemez:

Veya bir: Eğer piton olmayan zarif bir şekilde ölmeye neden kötü bir şey yaparsanız bu size yardımcı olmadığını
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 

Not (örn os._exit aracılığıyla veya bir SegmentationFault veya BusError)

+0

@ire_and_curses'in kopyası - Bağlantıyı eklediğiniz için teşekkür ederiz. Takdir edildi. – mgilson

+1

"kötü durum" en ilginç olanıdır) – vak

+0

http://stackoverflow.com/questions/25542110/kill-child-process-if-parent-is-killed- adresindeki "kötü durum" için bir seçenek veriyorum in-python/25634723 # 25634723, ancak burada yardımcı olmaz (istemci kaynak koduna erişim gerektirir). –