python - पूरी तरह से स्वतंत्र प्रक्रिया शुरू करें




python-2.7 subprocess (2)

मैं अपनी पाइथन स्क्रिप्ट (main.py) से एक प्रक्रिया शुरू करना चाहता था, विशेष रूप से मैं नीचे कमांड चलाना चाहता हूं

`nohup python ./myfile.py &`

और यह फाइल myfile.py मेरे मुख्य अजगर स्क्रिप्ट से बाहर निकलने के बाद भी होनी चाहिए।

इसके अतिरिक्त, मैं नई प्रक्रिया की सहायता प्राप्त करना चाहता हूं।

मैंने os.spawnl* , os.exec* & subprocess.Popen os.exec* की कोशिश की, अगर मेरी main.py स्क्रिप्ट बाहर निकलती है तो सभी मेरे myfile.py को समाप्त कर रहे हैं।

मुझे कुछ याद आ रहा है।

अपडेट: क्या मैं xdg-open साथ xdg-open उपयोग कर सकता हूं? क्या यह सही दृष्टिकोण है?

उदाहरण

a = subprocess.Popen([sys.executable, "nohup /usr/bin/python25 /long_process.py &"],\
     stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE)
print a.pid

अगर मैं ps aux | grep long_process जाँच करता हूँ ps aux | grep long_process ps aux | grep long_process , मैं किसी भी प्रक्रिया को नहीं देख सकता था।

long_process.py जो कुछ पाठ प्रिंट करता रहता है: कोई निकास नहीं।

क्या मैं यहाँ कुछ गलत कर रहा हूँ?


मुझे कोई प्रक्रिया नहीं चल रही थी।

आप किसी भी प्रक्रिया को नहीं देखते हैं क्योंकि चाइल्ड python प्रक्रिया तुरंत निकल जाती है। Popen तर्क गलत हैं क्योंकि उपयोगकर्ता टिप्पणी में484815162342 कहता है

पूरी तरह से स्वतंत्र प्रक्रिया शुरू करने के लिए, आप python-daemon पैकेज का उपयोग कर सकते हैं या सिस्टमड / सुपरवाइजर / आदि का उपयोग कर सकते हैं:

#!/usr/bin/python25
import daemon
from long_process import main

with daemon.DaemonContext():
    main()

हालाँकि यह आपके मामले में पर्याप्त हो सकता है, बच्चे को सही Popen तर्क के साथ शुरू करने के लिए:

with open(os.devnull, 'r+b', 0) as DEVNULL:
    p = Popen(['/usr/bin/python25', '/path/to/long_process.py'],
              stdin=DEVNULL, stdout=DEVNULL, stderr=STDOUT, close_fds=True)
time.sleep(1) # give it a second to launch
if p.poll(): # the process already finished and it has nonzero exit code
    sys.exit(p.returncode)

यदि बच्चे की प्रक्रिया को python2.5 आवश्यकता नहीं है, तो आप इसके बजाय sys.executable उपयोग कर सकते हैं (माता-पिता के समान पायथन संस्करण का उपयोग करने के लिए)।

नोट: कोड बच्चे की प्रक्रिया समाप्त होने की प्रतीक्षा किए बिना माता-पिता में DEVNULL को बंद कर देता है (इसका बच्चे पर कोई प्रभाव नहीं पड़ता)।


आप os.fork() उपयोग कर सकते हैं।

import os
pid=os.fork()
if pid==0: # new process
    os.system("nohup python ./myfile.py &")
    exit()
# parent process continues




child-process