Comment vérifier sous Linux avec Python si un processus est toujours en cours d’exécution ?[dupliquer]

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

  •  09-06-2019
  •  | 
  •  

Question

Cette question a déjà une réponse ici :

Le seul bon la façon dont j'ai trouvé est la suivante :

import sys
import os

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

(Source)
Mais est-ce fiable ?Cela fonctionne-t-il avec chaque processus et chaque distribution ?

Était-ce utile?

La solution

La réponse de Mark est la voie à suivre, après tout, c'est pourquoi le système de fichiers /proc est là.Pour quelque chose d'un peu plus copier/coller :

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

Autres conseils

sous Linux, vous pouvez consulter le répertoire /proc/$PID pour obtenir des informations sur ce processus.En fait, si le répertoire existe, le processus est en cours d'exécution.

Il devrait fonctionner sur n'importe quel système POSIX (même si en regardant le /proc le système de fichiers, comme d'autres l'ont suggéré, est plus facile si vous savez qu'il sera là).

Cependant: os.kill peut également échouer si vous n'êtes pas autorisé à signaler le processus.Vous devrez faire quelque chose comme :

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"

Voici la solution qui a résolu le problème pour moi :

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

Je suis un débutant Python + Linux, donc ce n'est peut-être pas optimal.Cela a résolu mon problème et j'espère qu'il aidera également d'autres personnes.

// Mais est-ce fiable ?Cela fonctionne-t-il avec chaque processus et chaque distribution ?

Oui, cela devrait fonctionner sur n'importe quelle distribution Linux.Sachez que /proc n'est cependant pas facilement disponible sur les systèmes basés sur Unix (FreeBSD, OSX).

Il me semble qu'une solution basée sur PID est trop vulnérable.Si le processus dont vous essayez de vérifier l'état a été terminé, son PID peut être réutilisé par un nouveau processus.Ainsi, IMO ShaChris23, le débutant Python + Linux, a donné la meilleure solution au problème.Même cela ne fonctionne que si le processus en question est identifiable de manière unique par sa chaîne de commande, ou si vous êtes sûr qu'il n'y en aura qu'un seul en cours d'exécution à la fois.

J'utilise ceci pour obtenir les processus et le nombre de processus du nom spécifié

import os

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

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

J'ai eu des problèmes avec les versions ci-dessus (par exemple, la fonction a également trouvé une partie de la chaîne et de telles choses ...) J'ai donc écrit ma propre version modifiée de 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

Je pense que c'est plus fiable, plus facile à lire et que vous avez la possibilité de vérifier les identifiants ou les noms de processus.

Version légèrement modifiée du script ShaChris23.Vérifie si la valeur proc_name est trouvée dans la chaîne d'arguments du processus (par exemple, un script Python exécuté avec 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top