python नमक यदि आप एक प्रक्रिया अभी भी चल रहे हैं, तो आप पायथन के साथ लिनक्स में कैसे जांच करते हैं?




प्रेगनेंसी टेस्ट रिजल्ट्स (8)

// लेकिन यह विश्वसनीय है? क्या यह हर प्रक्रिया और हर वितरण के साथ काम करता है?

हां, यह किसी भी लिनक्स वितरण पर काम करना चाहिए। ध्यान रखें कि / proc यूनिक्स आधारित सिस्टम पर आसानी से उपलब्ध नहीं है, हालांकि (फ्री बीएसडी, ओएसएक्स)।

मुझे मिल गया एकमात्र अच्छा तरीका यह है:

import sys
import os

try:
        os.kill(int(sys.argv[1]), 0)
        print "Running"
except:
        print "Not running"

( स्रोत )
लेकिन क्या यह विश्वसनीय है? क्या यह हर प्रक्रिया और हर वितरण के साथ काम करता है?


मैं इसका उपयोग प्रक्रियाओं को प्राप्त करने के लिए करता हूं, और निर्दिष्ट नाम की प्रक्रिया की गणना करता हूं

import os

processname = 'somprocessname'
tmp = os.popen("ps -Af").read()
proccount = tmp.count(processname)

if proccount > 0:
    print(proccount, ' processes running of ', processname, 'type')

यह समाधान मेरे लिए इसका हल है:

import os
import subprocess
import re

def findThisProcess( process_name ):
  ps     = subprocess.Popen("ps -eaf | grep "+process_name, shell=True, stdout=subprocess.PIPE)
  output = ps.stdout.read()
  ps.stdout.close()
  ps.wait()

  return output

# This is the function you can use  
def isThisRunning( process_name ):
  output = findThisProcess( process_name )

  if re.search('path/of/process'+process_name, output) is None:
    return False
  else:
    return True

# Example of how to use
if isThisRunning('some_process') == False:
  print("Not running")
else:
  print("Running!")

मैं एक पायथन + लिनक्स नौसिखिया हूं, इसलिए यह इष्टतम न हो। यह मेरी समस्या का हल है, और उम्मीद है कि अन्य लोगों को भी मदद मिलेगी।


ShaChris23 स्क्रिप्ट के बदसूरत रूप से संशोधित संस्करण जाँच करता है कि proc_name मान प्रक्रिया में मौजूद है args स्ट्रिंग (उदाहरण के लिए पायथन के साथ निष्पादित पायथन):

def process_exists(proc_name):
    ps = subprocess.Popen("ps ax -o pid= -o args= ", shell=True, stdout=subprocess.PIPE)
    ps_pid = ps.pid
    output = ps.stdout.read()
    ps.stdout.close()
    ps.wait()

    for line in output.split("\n"):
        res = re.findall("(\d+) (.*)", line)
        if res:
            pid = int(res[0][0])
            if proc_name in res[0][1] and pid != os.getpid() and pid != ps_pid:
                return True
    return False

मार्क का उत्तर ही जाने का रास्ता है, आखिरकार, यही कारण है कि / proc फाइल सिस्टम वहाँ है थोड़ी अधिक कॉपी / पेस्टेबल के लिए:

 >>> import os.path
 >>> os.path.exists("/proc/0")
 False
 >>> os.path.exists("/proc/12")
 True

इसे किसी भी POSIX सिस्टम पर काम करना चाहिए (यद्यपि /proc फाइलसिस्टम को देखते हुए, जैसा कि अन्य लोगों ने सुझाया है, यदि आपको पता है कि यह वहां होना है तो आसान है)।

हालांकि: यदि आपके पास इस प्रक्रिया को संकेत देने की अनुमति नहीं है, तो os.kill भी विफल हो सकता है। आपको ऐसा कुछ करने की आवश्यकता होगी:

import sys
import os
import errno

try:
    os.kill(int(sys.argv[1]), 0)
except OSError, err:
    if err.errno == errno.ESRCH:
        print "Not running"
    elif err.errno == errno.EPERM:
        print "No permission to signal this process!"
    else:
        print "Unknown error"
else:
    print "Running"

मुझे ऊपर दिए गए संस्करणों के साथ समस्या थी (उदाहरण के लिए फ़ंक्शन को स्ट्रिंग का एक हिस्सा भी मिल गया था और ऐसी चीजें ...) तो मैंने अपनी खुद की, संशोधित संस्करण का लिखा मैक्सिम कोज़लेंको:

#proc    -> name/id of the process
#id = 1  -> search for pid
#id = 0  -> search for name (default)

def process_exists(proc, id = 0):
   ps = subprocess.Popen("ps -A", shell=True, stdout=subprocess.PIPE)
   ps_pid = ps.pid
   output = ps.stdout.read()
   ps.stdout.close()
   ps.wait()

   for line in output.split("\n"):
      if line != "" and line != None:
        fields = line.split()
        pid = fields[0]
        pname = fields[3]

        if(id == 0):
            if(pname == proc):
                return True
        else:
            if(pid == proc):
                return True
return False

मुझे लगता है कि यह और अधिक विश्वसनीय, पढ़ने में आसान है और आपके पास प्रोसेस आईडी या नाम की जांच करने का विकल्प है


लिनक्स पर, आप उस प्रक्रिया के बारे में जानकारी प्राप्त करने के लिए डायरेक्टरी / proc / $ PID में देख सकते हैं। वास्तव में, यदि निर्देशिका मौजूद है, तो प्रक्रिया चल रही है।





process