2011-11-03 11 views
15

मैं एक गंधा छोटे से समारोह पर काम कर रहा हूँ हो रही:popen के साथ एक प्रक्रिया खुलने और पीआईडी ​​

def startProcess(name, path): 
    """ 
    Starts a process in the background and writes a PID file 

    returns integer: pid 
    """ 

    # Check if the process is already running 
    status, pid = processStatus(name) 

    if status == RUNNING: 
     raise AlreadyStartedError(pid) 

    # Start process 
    process = subprocess.Popen(path + ' > /dev/null 2> /dev/null &', shell=True) 

    # Write PID file 
    pidfilename = os.path.join(PIDPATH, name + '.pid') 
    pidfile = open(pidfilename, 'w') 
    pidfile.write(str(process.pid)) 
    pidfile.close() 

    return process.pid 

समस्या यह है कि process.pid सही पीआईडी ​​नहीं है। ऐसा लगता है कि यह सही पीआईडी ​​से हमेशा 1 कम है। उदाहरण के लिए, यह कहता है कि प्रक्रिया 3172 9 पर शुरू हुई, लेकिन ps का कहना है कि यह 31730 पर चल रहा है। हर बार मैंने कोशिश की है कि यह 1 से बंद हो। मैं पीआईडी ​​का अनुमान लगा रहा हूं कि यह वर्तमान प्रक्रिया का पीआईडी ​​है, न कि एक शुरू किया, और नई प्रक्रिया 'अगली' पिड जो 1 उच्च है। यदि ऐसा है, तो मैं केवल process.pid + 1 पर वापस भरोसा नहीं कर सकता क्योंकि मुझे कोई गारंटी नहीं है कि यह हमेशा सही रहेगा।

क्यों process.pid नई प्रक्रिया के पीआईडी ​​को वापस नहीं करता है, और मैं उसके बाद के व्यवहार को कैसे प्राप्त कर सकता हूं?

+1

'shell = True' और '' '' सामान को हटाने का प्रयास करें। – Blender

+0

मुझे एक ही समस्या है और मुझे मुश्किल से पता चला है, यह हमेशा पीआईडी ​​+ 1 नहीं है, यह पहले था, लेकिन अब यह मुझे +2 – andrei

उत्तर

19

प्रलेखन से http://docs.python.org/library/subprocess.html पर:

Popen.pid The process ID of the child process.

Note that if you set the shell argument to True, this is the process ID of the spawned shell.

तो shell गलत है, यह आपकी अपेक्षा के अनुरूप व्यवहार करना चाहिए, मुझे लगता है।

+0

दे रहा है मुझे काम करने के लिए पाइथन के सापेक्ष पथ के लिए 'shell = True' की आवश्यकता है। मुझे लगता है कि मैं इसे पूर्ण पथ से बदल दूंगा और 'खोल' को गलत पर सेट करूंगा। जानकारी के लिए धन्यवाद! – Hubro

+1

os.path.abspath के माध्यम से पथ को पास करने से पहले इसे आपके लिए ठीक करना चाहिए। http://docs.python.org/library/os.path.html –

+0

नहीं, 'os.path.abspath (' पायथन ') चल रहा है' बस मेरी कार्यशील निर्देशिका प्लस 'पायथन' देता है, उदा। '/ root/python' – Hubro

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