2011-04-01 10 views
15

मैं एक वेब ऐप लिख रहा हूं जो सेलेनियम का उपयोग दूसरी वेबसाइट को स्क्रैप करने के लिए करता है। यह स्क्रीन-स्क्रैपिंग केवल दिन में एक बार होती है, इसलिए मैं हर समय सेलेनियम और एक्सवीएफबी को नहीं छोड़ूंगा।पायथन में उपप्रोसेस मॉड्यूल का उपयोग करके मैं एक लिनक्स प्रोग्राम कैसे शुरू और बंद कर सकता हूं?

मैं समझने की कोशिश कर रहा हूं कि पाइथन से एक्सवीएफबी और सेलेनियम कैसे शुरू करें, और फिर स्क्रीन-स्क्रैपिंग के बाद उन्हें रोक दें।

अगर मैं इसे मैन्युअल रूप से कर रहा था, मैं उन्हें आदेश पंक्ति पर प्रारंभ करें, और CTRLसी मारा उन्हें रोकने के लिए चाहते हैं। मैं पाइथन से वही काम करने की कोशिश कर रहा हूं।

मैं सफलतापूर्वक इस तरह Xvfb शुरू करने में सक्षम होने लगते हैं:

xvfb = Popen('Xvfb :99 -nolisten tcp', shell=True) 

लेकिन इसे समाप्त जब मैं कोशिश की है करने के लिए:

xvfb.terminate() 

और फिर इसे शुरू करने के लिए फिर से (दोहराते हुए की कोशिश की मेरा प्रारंभिक आदेश), यह मुझे बताता है कि यह पहले से चल रहा है।

+0

यह पांच अपवॉट प्राप्त करता है? मैंने माना कि मैं वास्तव में बेवकूफ था! –

+0

'xvfb.wmin()' 'xvfb.terminate()' के बाद कोशिश करें। विफल होने पर, 'xvfb.kill() 'आज़माएं। –

+3

Ctrl-C एक यूनिक्स प्रक्रिया में SIGTERM भेजता है। आपकी उपयोगकर्ता पायथन प्रक्रिया आपके Xvfb को रूट के रूप में चलने के लिए SIGTERM नहीं भेज सकती है। अपने बच्चे की पिड प्राप्त करें, "सुडो मार " निष्पादित करें, फिर "xvfb.wait()"। –

उत्तर

7

मैं नहीं जानता है आप एक्सवीएफबी रूट के रूप में क्यों चलाना चाहते हैं। आपके सामान्य एक्स सर्वर को केवल रूट (कई लेकिन सभी इकाइयों पर नहीं) के रूप में चलाने की आवश्यकता होती है ताकि यह वीडियो हार्डवेयर तक पहुंच सके; यह परिभाषा के अनुसार Xvfb के लिए कोई मुद्दा नहीं है।

tempdir = tempfile.mkdtemp() 
xvfb = subprocess.Popen(['Xvfb', ':99', '-nolisten', 'tcp', '-fbdir', tempdir]) 

जब आप एक्स सर्वर को समाप्त करते हैं, तो आप zombie process देख सकते हैं। यह वास्तव में एक प्रक्रिया नहीं है (यह मर चुका है), केवल प्रक्रिया तालिका में एक प्रविष्टि है जो माता-पिता की प्रक्रिया या तो बच्चे की निकास स्थिति को पढ़ती है या खुद मर जाती है। लाश अधिकतर हानिरहित होते हैं, लेकिन बाहर निकलने की स्थिति पढ़ने के लिए wait पर कॉल करना क्लीनर है।

xvfb.terminate() 
# At this point, `ps -C Xvfb` may still show a running process 
# (because signal delivery is asynchronous) or a zombie. 
xvfb.wait() 
# Now the child is dead and reaped (assuming it didn't catch SIGTERM). 
+0

@ गिल्स: आह, गेटचा - मैंने कॉपी किया और उस आदेश को चिपकाया जिसे मैं किसी वेब पेज से Xvfb शुरू करने के लिए उपयोग करता हूं । मुझे एहसास नहीं हुआ कि यह 'fbdir' विकल्प था क्योंकि यह काम नहीं कर रहा था अगर मैंने इसे रूट के रूप में नहीं चलाया। मैंने इसे अभी हटा दिया है और इसे अपने सामान्य उपयोगकर्ता के रूप में चला सकता हूं, लेकिन '.terminate()' और '.kill()' अभी भी Xvfb को रोकने के लिए प्रतीत नहीं होता है। –

+0

@ पॉल: मैंने 'पॉपन' कॉल में कुछ टाइपो बनाए लेकिन मुझे लगता है कि आपको यह सही मिला है। क्या आप निश्चित हैं कि '.minminate() 'और' .kill() 'प्रक्रिया को समाप्त नहीं कर रहे हैं? एक ज़ोंबी रह सकता है (जब आपकी पाइथन लिपि समाप्त हो जाती है तो यह गायब हो जाएगी), मेरा संपादन देखें। – Gilles

+0

@ गिल्स: हाँ, ऐसा लगता है कि प्रक्रिया चारों ओर लटक रही है। '.minminate()', '.kill()' के बाद, और जब मैं पाइथन खोल से बाहर निकलता हूं, तो 'ps-c Xvfb' अभी भी रिपोर्ट करता है कि Xvfb चल रहा है। जब मैं Xvfb को फिर से शुरू करने का प्रयास करता हूं, तो यह भी कहता है कि सर्वर पहले से सक्रिय है। (मुझे लगता है कि यह सिर्फ इसलिए है क्योंकि फ़ाइल '/ tmp/.X99-lock' अभी भी मौजूद है, लेकिन 'ps -C Xvfb' पुष्टि करता है कि प्रक्रिया अभी भी चल रही है।) –

1

मुझे लगता है कि आप किसी भी उपयोगकर्ता Xvfb शुरू करने के लिए के रूप में अपने सभी समस्याओं को हल करने

संपादित समझाया here अनुमति देने के लिए अपने सिस्टम parametrize कर सकते हैं सही कमांड लाइन

sudo chmod u+s `which Xvfb` 
+0

हो सकता है - इसका कौन सा हिस्सा किसी भी उपयोगकर्ता को Xvfb लॉन्च करने की अनुमति देता है? क्या यह 'सुडो मॉड यू + एस' एक्सवीएफबी 'है? मैं 'mod' कमांड से परिचित नहीं हूं, और यह कुछ हद तक प्रतिरक्षा है - क्या आप इसका विस्तार कर सकते हैं? –

+0

वास्तव में यह 'chmod u + s' होना चाहिए जैसा कि यहां बताया गया है http://en.wikipedia.org/wiki/Chmod –

+0

मुझे संदेह है कि' mod 'कमांड कमांड पर मदद करने के लिए मौजूद है, बस' मैन कमांड 'लिखें ' –

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

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