2013-01-02 24 views
11

में माता-पिता दुर्घटनाओं मैं एक सर्वर सी में लिखा अजगर कार्यक्रम संकलित सर्वर subprocess मॉड्यूल का उपयोग कर की शुरूआत परीक्षण करने के लिए एक अजगर प्रोग्राम लिखने के लिए कोशिश कर रहा हूँ:हत्या बच्चे प्रक्रिया जब अजगर

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

यह ठीक काम करता है, हालांकि अगर पाइथन प्रोग्राम किसी त्रुटि के कारण अप्रत्याशित रूप से समाप्त हो जाता है, तो उत्पन्न प्रक्रिया चल रही है। मुझे यह सुनिश्चित करने के लिए एक तरीका चाहिए कि यदि पाइथन प्रोग्राम अप्रत्याशित रूप से बाहर निकलता है, तो सर्वर प्रक्रिया भी मारे जाती है।

कुछ और जानकारी:

  • लिनक्स या OSX ऑपरेटिंग सिस्टम केवल
  • सर्वर कोड
+0

"किसी त्रुटि के कारण" - किस तरह की त्रुटि? – mgilson

+0

नेटवर्किंग त्रुटियां, कीबोर्ड बाधा, आदि – charliehorse55

+1

[पर्यवेक्षक] (http://supervisord.org/) पाइथन में लिखे गए एक ओपन-सोर्स प्रोसेस प्रबंधन डिमन है। यदि आपके पास समय है तो स्रोत कोड एक लायक हो सकता है। –

उत्तर

19

मैं atexit.register प्रक्रिया समाप्त करने के लिए एक समारोह होगा किसी भी तरह से नहीं बदला जा सकता:

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

या शायद:

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 

नोट अगर आप अजगर एक गैर सुंदर तरह से मरने के लिए पैदा करने के लिए कुछ बुरा करते हैं कि यह आप में मदद नहीं करता (उदाहरण os._exit के माध्यम से या यदि आप SegmentationFault या BusError)

+0

@ire_and_curses का डुप्लिकेट - लिंक जोड़ने के लिए धन्यवाद। यह सराहना की है। – mgilson

+1

"बुरा मामला" सबसे दिलचस्प है) – vak

+0

मैं http://stackoverflow.com/questions/25542110/kill-child-process-if-parent-is-killed- में "बुरा मामला" के लिए एक विकल्प देता हूं। इन-पायथन/25634723 # 25634723, लेकिन यह यहां सहायता नहीं करता है (इसे क्लाइंट स्रोत कोड तक पहुंच की आवश्यकता है)। –