2009-11-10 21 views
13

मेरे वेब इंटरफ़ेस के माध्यम से मैं कुछ प्रक्रियाओं को शुरू/बंद करना चाहता हूं और यह निर्धारित करना चाहता हूं कि एक प्रारंभिक प्रक्रिया अभी भी चल रही है या नहीं।लिनक्स प्रक्रिया प्रबंधन के लिए पायथन पुस्तकालय

मेरी मौजूदा वेबसाइट पाइथन आधारित है और लिनक्स सर्वर पर चल रही है, तो क्या आप इस कार्यक्षमता का समर्थन करने वाली उपयुक्त लाइब्रेरी के बारे में जानते हैं?

धन्यवाद

उत्तर

13

की जाँच करें अजगर उप प्रक्रियाओं/बंद शुरू करने के लिए आप उपप्रक्रिया मॉड्यूल का उपयोग कर सकते हैं। जानने के लिए कि वे तुम्हें psutil का उपयोग कर सकते चल रहे हैं:

>>> import psutil 
>>> pid = 1034 # some pid 
>>> psutil.pid_exists(pid) 
True 
>>> 

... या इस (यह भी अगर पीआईडी ​​पुन: उपयोग किया गया है की जाँच करेगा):

>>> p = psutil.Process(pid) 
>>> p.is_running() 
True 
>>> 
1

ओएस मॉड्यूल शायद आपका मित्र है। उदाहरण के लिए os.kill है, उदाहरण के लिए।

प्रक्रियाओं की एक सूची प्राप्त करने के मामले में, आप शायद ps कमांड को खोलना चाहेंगे। This question उस पर अधिक जानकारी है।

+0

हाँ मैं कर रहा हूँ आदर्श मैन्युअल ps – hoju

+2

एक खोल के अंदर 'ps' आदेश चल रहा है पार्स करने से उच्चतर स्तर पुस्तकालय बाद एक बहुत अधिक/proc उपयोग के बारे में tylerl के नोट से खतरनाक है। इसके बजाय ऐसा करो। –

+0

यह खतरनाक कैसे हो सकता है? – hoju

6

/proc निर्देशिका की सामग्री को देखकर चल रही प्रक्रियाओं की सूची की जांच करना ("पीएस" जैसी मूल उपयोगिताओं द्वारा भी पूरा किया जाता है)।

जैसे, पुस्तकालय आप प्रक्रिया चल क्वेरी करने के लिए रुचि रखते हैं एक ही रूप में किसी भी अन्य फ़ाइलों और निर्देशिकाओं (यानी sys या os साथ काम करना, स्वाद आप के बाद कर रहे हैं पर निर्भर करता है के लिए इस्तेमाल किया है। os.path पर विशेष ध्यान दें हालांकि, यह आपके द्वारा किए जाने वाले अधिकांश कार्यों में से अधिकांश है)। प्रक्रियाओं को समाप्त या अन्यथा बातचीत करने के लिए, आप उन्हें सिग्नल भेजते हैं, जो os.kill के साथ पूरा किया जाता है। अंत में, आप os.popen और दोस्तों का उपयोग करके नई प्रक्रियाएं शुरू करते हैं।

0

पायथन उपप्रोसेसर http://docs.python.org/library/subprocess.html आपकी मदद कर सकता है। यदि आप उपप्रोसेस के साथ एक प्रक्रिया बनाते हैं, तो आप इसे रोकने के लिए Popen.terminate() फ़ंक्शन का उपयोग कर सकते हैं।

2

जब से तुम ने कहा कि यह एक Linux सर्वर है, बाहरी ps द्विआधारी आमतौर पर धीमी है बुला, और अधिक संसाधनों का उपयोग करता है और अधिक त्रुटि /proc सीधे से जानकारी का उपयोग करने से होने का खतरा है।

के बाद से किसी और उल्लेख किया है, एक आसान तरीका है:

glob.glob('/proc/[0-9]*/') 

गुड लक।

2

यह मैं उपयोग करता हूं। यह procfs का उपयोग करता है (इसलिए आप सिस्टम जैसे यूनिक्स तक सीमित हैं, मैक पर काम नहीं करेंगे) और पहले उल्लिखित ग्लोब। यह cmdline भी प्राप्त करता है, जो आपको प्रक्रिया की पहचान करने की अनुमति देता है। प्रक्रिया को मारने के लिए आप os.kill(signal.SIGTERM, pid) का उपयोग कर सकते हैं। उपप्रक्रिया का उपयोग कर के लिए, इस पोस्ट Python, Popen and select - waiting for a process to terminate or a timeout

def list_processes(): 
    """ 
    This function will return an iterator with the process pid/cmdline tuple 

    :return: pid, cmdline tuple via iterator 
    :rtype: iterator 

    >>> for procs in list_processes(): 
    >>>  print procs 
    ('5593', '/usr/lib/mozilla/kmozillahelper') 
    ('6353', 'pickup -l -t fifo -u') 
    ('6640', 'kdeinit4: konsole [kdeinit]') 
    ('6643', '/bin/bash') 
    ('7451', '/usr/bin/python /usr/bin/ipython') 
    """ 
    for pid_path in glob.glob('/proc/[0-9]*/'): 

     # cmdline represents the command whith which the process was started 
     f = open("%s/cmdline" % pid_path) 
     pid = pid_path.split("/")[2] # get the PID 
     # we replace the \x00 to spaces to make a prettier output from kernel 
     cmdline = f.read().replace("\x00", " ").rstrip() 
     f.close() 

     yield (pid, cmdline) 
0

मैं PSutil का उपयोग करेंगे।अजगर-linux-procfs नामक एक पायथन मॉड्यूल है, जो मूल पार्स/proc, प्रक्रियाओं का प्रबंधन करने के

import psutil 

for proc in psutil.get_process_list(): 
    if proc.username == 'yourusername': 
     if myappname in proc.cmdline: 
      print 'App is running' 

वैकल्पिक रूप से, रेड हैट उपयोग करने और बनाए रखने: एक व्यावहारिक उदाहरण प्रदान करना। यह बहुत अच्छी तरह से प्रचारित नहीं है, लेकिन कुछ अतिरिक्त लिनक्स-विशिष्ट विशेषताओं (उदाहरण के लिए, शेड्यूलिंग क्लास) प्रदान करता है जो कभी-कभी उपयोगी होते हैं।

http://pkgs.fedoraproject.org/gitweb/?p=python-linux-procfs.git

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