2012-03-11 13 views
8

मैं कॉलिंग स्क्रिप्ट के मरने के बाद एक डीजेंगो प्रक्रिया को जन्म देने की कोशिश कर रहा हूं। लेकिन मुझे इसकी पीआईडी ​​चाहिए।क्या प्रबंधन.py अपना पीआईडी ​​बदलता है?

def runserver(): 
    print("START PID: " + str(os.getpid())) 
    pid = os.fork() 

    if pid == 0: 
     #cmd = "/usr/bin/env python manage.py runserver 0.0.0.0:2869" 
     print("IN THE CHILD PID: " + str(os.getpid())) 
     os.execvp("python", ["", "manage.py", "runserver", "0.0.0.0:2869"]) 
    else: 
     print("PARENT PID: " + str(os.getpid())) 
     print("CHILD PID: " + str(pid)) 
     updatepid("runserver", pid) 

यह मैं निम्नलिखित उत्पादन देता है:

तो मैं निम्नलिखित कोड लिखा

> ps aux | grep python | grep -v grep 
sandro 13031 0.4 0.3 296080 23756 pts/2 Sl 22:14 0:01 /home/sandro/.virtualenvs/polling/bin/python2.7 manage.py runserver 0.0.0.0:2869 

पीआईडी:

START PID: 13019 
PARENT PID: 13019 
CHILD PID: 13020 
IN THE CHILD PID: 13020 

लेकिन अब जब मैं लाइव प्रक्रियाओं की जांच बदला हुआ! पृथ्वी पर क्या चल रहा है???

+0

मुझे पता है * मुझे यह पूछने पर खेद है, लेकिन * क्यों * आप अपनी स्क्रिप्ट से रनरवर शुरू कर रहे हैं? –

+0

ज्यादातर मेरे लिए एक प्रयोग। बस एक त्वरित हैकी स्क्रिप्ट एक साथ डालने जो मेरे पालतू django साइट के लिए सभी प्रक्रियाओं का ट्रैक रखता है। कोई चिंता नहीं, प्रोड या कुछ भी नहीं;) जब मैं पहिया का आविष्कार कर रहा हूं, तो क्या ऐसा कोई उपकरण है जो पहले से ही इस तरह की चीजें करता है जिसे आप सुझा सकते हैं? – Sandro

+0

वास्तव में कुछ भी सुझाव नहीं दे सकता है, क्योंकि मैं हमेशा Django को mod_wsgi के तहत चलाता हूं। और वहाँ बहुत सारे httpd प्रबंधन उपकरण हैं। –

उत्तर

5

यदि आप अन्य पीआईडी ​​देखते हैं तो निश्चित रूप से एक नई प्रक्रिया है। आप आसानी से उस स्थान को ढूंढ सकते हैं जहां नई प्रक्रिया उत्पन्न हुई थी। django.core.management.commands.runserver में शुरू करें और आप django.utils.autoreload.python_reloader पर आ जाएंगे। इस प्रकार

exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ) 

, अपनी स्क्रिप्ट के साथ दो प्रक्रियाओं मिलती है:: जब python_reloader एक प्रक्रिया में पहली बार कहा जाता है यह restart_with_reloader को जाता है जहां आप यह देख सकते जहां runserver निष्पादित हो रहा है और एक (पैदा) वेब सर्वर के साथ। इसे जांचें:

START PID: 3091 
PARENT PID: 3091 
CHILD PID: 3092 
IN THE CHILD PID: 3092 

$ ps ax | grep runserver | grep -v grep 
3092 pts/1 S  0:00 runserver 0.0.0.0:2869 
3093 pts/1 Sl  0:05 /home/kirill/testenv/bin/python manage.py runserver 0.0.0.0:2869 
+1

@ सैंड्रो: यदि आपने पहली जगह execvp कॉल में प्रक्रिया के नाम पर पारित किया है, तो आप तुरंत यह सुनिश्चित कर लेंगे कि हमेशा दो प्रक्रियाएं होतीं। 'os.execvp (" पायथन ", [" पायथन "," manage.py "," रनरवर "," 0.0.0.0 डाउनलोड 86 9 "])। यह – Phani

+0

@ किरील करने के लिए हमेशा एक अच्छा अभ्यास है। मुझे नहीं पता कि मैंने स्पॉन के लिए कोड बेस क्यों नहीं दिया था! धन्यवाद! – Sandro

+0

@ पूनी मुझे यकीन नहीं है कि मैं अनुसरण करता हूं। पहला तर्क क्या जोड़ता है? – Sandro

संबंधित मुद्दे