كيف يمكنك التحقق من Linux باستخدام Python إذا كانت العملية لا تزال قيد التشغيل؟[ينسخ]

StackOverflow https://stackoverflow.com/questions/38056

  •  09-06-2019
  •  | 
  •  

سؤال

هذا السؤال لديه بالفعل إجابة هنا:

الوحيد لطيف - جيد الطريقة التي وجدتها هي:

import sys
import os

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

(مصدر)
ولكن هل هذا موثوق؟هل يعمل مع كل عملية وكل توزيع؟

هل كانت مفيدة؟

المحلول

إجابة مارك هي الطريق الذي يجب اتباعه، ولهذا السبب يوجد نظام الملفات /proc.للحصول على شيء أكثر نسخًا/لصقًا:

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

نصائح أخرى

في نظام التشغيل Linux، يمكنك البحث في الدليل /proc/$PID للحصول على معلومات حول هذه العملية.في الواقع، إذا كان الدليل موجودًا، فإن العملية قيد التشغيل.

يجب أن يعمل على أي نظام 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"

إليك الحل الذي حل المشكلة بالنسبة لي:

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!")

أنا مبتدئ في Python + Linux، لذا قد لا يكون هذا هو الأمثل.لقد حلت مشكلتي، وآمل أن يساعد الآخرين أيضًا.

// لكن هل هذا موثوق؟هل يعمل مع كل عملية وكل توزيع؟

نعم، يجب أن يعمل على أي توزيعة لينكس.انتبه إلى أن /proc ليس متاحًا بسهولة على الأنظمة المستندة إلى Unix، على الرغم من (FreeBSD، OSX).

يبدو لي أن الحل القائم على PID ضعيف للغاية.إذا تم إنهاء العملية التي تحاول التحقق من حالتها، فيمكن إعادة استخدام معرف المنتج (PID) الخاص بها من خلال عملية جديدة.لذا، قدم IMO ShaChris23، المبتدئ في Python + Linux، أفضل حل للمشكلة.حتى أنه يعمل فقط إذا كانت العملية المعنية قابلة للتعريف بشكل فريد من خلال سلسلة الأوامر الخاصة بها، أو إذا كنت متأكدًا من أنه سيكون هناك عملية واحدة فقط قيد التشغيل في كل مرة.

أستخدم هذا للحصول على العمليات وعدد العمليات الخاصة بالاسم المحدد

import os

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

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

لقد واجهت مشاكل مع الإصدارات أعلاه (على سبيل المثال ، تم العثور على الوظيفة أيضًا جزءًا من السلسلة ومثل هذه الأشياء ...) لذلك كتبت نسختي المعدلة الخاصة بي من Maksym Kozlenko:

#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

أعتقد أنه أكثر موثوقية وأسهل في القراءة ولديك خيار التحقق من معرفات أو أسماء العمليات.

نسخة معدلة بشكل طفيف من البرنامج النصي ShaChris23.يتحقق من العثور على قيمة proc_name ضمن سلسلة وسيطات العملية (على سبيل المثال برنامج Python النصي الذي تم تنفيذه باستخدام python ):

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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top