Frage

Auf diese Frage gibt es hier bereits eine Antwort:

Die einzige Hübsch So habe ich Folgendes gefunden:

import sys
import os

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

(Quelle)
Aber ist das zuverlässig?Funktioniert es mit jedem Prozess und jeder Distribution?

War es hilfreich?

Lösung

Marks Antwort ist der richtige Weg, schließlich gibt es deshalb das /proc-Dateisystem.Für etwas, das sich etwas besser kopieren/einfügen lässt:

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

Andere Tipps

Unter Linux können Sie im Verzeichnis /proc/$PID nachsehen, um Informationen zu diesem Prozess zu erhalten.Wenn das Verzeichnis vorhanden ist, wird der Prozess tatsächlich ausgeführt.

Es sollte auf jedem POSIX-System funktionieren (obwohl man sich das anschaut). /proc (Wie andere vorgeschlagen haben, ist es einfacher, das Dateisystem zu öffnen, wenn man weiß, dass es vorhanden ist.)

Jedoch: os.kill kann auch fehlschlagen, wenn Sie nicht über die Berechtigung zum Signalisieren des Prozesses verfügen.Sie müssten Folgendes tun:

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"

Hier ist die Lösung, die das Problem für mich gelöst hat:

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

Ich bin ein Python + Linux-Neuling, daher ist dies möglicherweise nicht optimal.Es hat mein Problem gelöst und wird hoffentlich auch anderen Menschen helfen.

// Aber ist das zuverlässig?Funktioniert es mit jedem Prozess und jeder Distribution?

Ja, es sollte auf jeder Linux-Distribution funktionieren.Beachten Sie jedoch, dass /proc auf Unix-basierten Systemen (FreeBSD, OSX) nicht ohne weiteres verfügbar ist.

Mir scheint, dass eine PID-basierte Lösung zu anfällig ist.Wenn der Prozess, dessen Status Sie überprüfen möchten, beendet wurde, kann seine PID von einem neuen Prozess wiederverwendet werden.Meiner Meinung nach hat ShaChris23, der Python + Linux-Neuling, die beste Lösung für das Problem gegeben.Dies funktioniert jedoch nur, wenn der betreffende Prozess anhand seiner Befehlszeichenfolge eindeutig identifizierbar ist oder Sie sicher sind, dass jeweils nur einer ausgeführt wird.

Ich verwende dies, um die Prozesse und die Anzahl der Prozesse mit dem angegebenen Namen abzurufen

import os

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

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

Ich hatte Probleme mit den obigen Versionen (z.B. fand die Funktion auch einen Teil des Strings und solche Dinge...) Also schrieb ich meine eigene, modifizierte Version von 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

Ich denke, es ist zuverlässiger, einfacher zu lesen und Sie haben die Möglichkeit, nach Prozess-IDs oder Namen zu suchen.

Leicht modifizierte Version des ShaChris23-Skripts.Überprüft, ob der Wert „proc_name“ in der Zeichenfolge „Prozessargumente“ gefunden wird (z. B. ein Python-Skript, das mit „python“ ausgeführt wird):

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top