¿Cómo se verifica en Linux con Python si un proceso aún se está ejecutando?[duplicar]

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Esta pregunta ya tiene respuesta aquí:

El único lindo La forma que he encontrado es:

import sys
import os

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

(Fuente)
¿Pero es esto confiable?¿Funciona con cada proceso y cada distribución?

¿Fue útil?

Solución

La respuesta de Mark es el camino a seguir; después de todo, es por eso que el sistema de archivos /proc está ahí.Para algo un poco más copiable/pegable:

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

Otros consejos

en Linux, puede buscar en el directorio /proc/$PID para obtener información sobre ese proceso.De hecho, si el directorio existe, el proceso se está ejecutando.

Debería funcionar en cualquier sistema POSIX (aunque mirando el /proc sistema de archivos, como otros han sugerido, es más fácil si sabes que va a estar ahí).

Sin embargo: os.kill También puede fallar si no tiene permiso para señalar el proceso.Necesitarías hacer algo como:

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"

Aquí está la solución que me lo resolvió:

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

Soy un novato en Python + Linux, por lo que puede que esto no sea óptimo.Resolvió mi problema y espero que también ayude a otras personas.

// ¿Pero es esto confiable?¿Funciona con cada proceso y cada distribución?

Sí, debería funcionar en cualquier distribución de Linux.Tenga en cuenta que /proc no está fácilmente disponible en sistemas basados ​​en Unix (FreeBSD, OSX).

Me parece que una solución basada en PID es demasiado vulnerable.Si el proceso cuyo estado está intentando verificar ha finalizado, su PID puede ser reutilizado por un nuevo proceso.Entonces, en mi opinión, ShaChris23, el novato de Python + Linux, dio la mejor solución al problema.Incluso solo funciona si el proceso en cuestión es identificable de forma única por su cadena de comando, o si está seguro de que solo habrá uno ejecutándose a la vez.

Utilizo esto para obtener los procesos y el recuento del proceso del nombre especificado.

import os

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

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

Tuve problemas con las versiones anteriores (por ejemplo, la función encontrada también parte de la cadena y tales cosas ...), así que escribí mi propia versión modificada 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

Creo que es más confiable, más fácil de leer y tiene la opción de verificar los identificadores o nombres de los procesos.

Versión ligeramente modificada del script ShaChris23.Comprueba si el valor proc_name se encuentra dentro de la cadena de argumentos del proceso (por ejemplo, script de Python ejecutado con 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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top