python - español - como saber si un script se esta ejecutando en linux
¿Cómo verifica en Linux con Python si todavía se está ejecutando un proceso? (9)
Esta pregunta ya tiene una respuesta aquí:
La única buena manera 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?
Debería funcionar en cualquier sistema POSIX (aunque mirar el sistema de archivos /proc
, como otros han sugerido, es más fácil si sabes que va a estar allí).
Sin embargo, os.kill
también puede fallar si no tiene permiso para señalar el proceso. Deberí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"
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 copy / pasteable:
>>> import os.path
>>> os.path.exists("/proc/0")
False
>>> os.path.exists("/proc/12")
True
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.
// ¿Pero esto es 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á disponible fácilmente en sistemas basados en Unix, sin embargo (FreeBSD, OSX).
Esta es la solución que me solucionó:
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 de Python + Linux, por lo que podría no ser óptimo. Resolvió mi problema y espero que ayude a otras personas también.
Me parece que una solución basada en PID es demasiado vulnerable. Si el proceso que está intentando verificar el estado de ha finalizado, su PID puede reutilizarse mediante un nuevo proceso. Entonces, IMO 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 exclusiva por su cadena de comandos, o si está seguro de que solo se ejecutará uno a la vez.
Versión modificada del script ShaChris23. Comprueba si el valor proc_name se encuentra dentro de la cadena args del proceso (por ejemplo, la secuencia de comandos de Python ejecutada 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
tuve problemas con las versiones anteriores (por ejemplo, la función que también se encuentra en la cadena y cosas por el estilo ...) 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 tienes la opción de verificar identificadores de proceso o nombres.
Lo uso 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'')