Como dijiste que este es un servidor Linux, llamar al ps externo el binario suele ser más lento, usa más recursos y es más propenso a errores que usar la información de /proc directamente.
Como nadie más lo mencionó, una manera simple es:
glob.glob('/proc/[0-9]*/')
Buena suerte.
Para iniciar/detener los subprocesos de python, puede usar el módulo de subprocesos. Para verificar si se están ejecutando, puede usar psutil:
>>> import psutil
>>> pid = 1034 # some pid
>>> psutil.pid_exists(pid)
True
>>>
...o esto (también comprobará si el PID ha sido reutilizado):
>>> p = psutil.Process(pid)
>>> p.is_running()
True
>>>
Esto es lo que uso. Utiliza procfs (por lo que está limitado a sistemas similares a Unix, creo que no funcionará en Mac) y el glob mencionado anteriormente. También obtiene la línea de cmd, que le permite identificar el proceso. Para matar el proceso puedes usar os.kill(signal.SIGTERM, pid)
. Para usar el subproceso, consulte esta publicación Python, Popen y seleccione:esperar a que termine un proceso o un tiempo de espera
def list_processes():
"""
This function will return an iterator with the process pid/cmdline tuple
:return: pid, cmdline tuple via iterator
:rtype: iterator
>>> for procs in list_processes():
>>> print procs
('5593', '/usr/lib/mozilla/kmozillahelper')
('6353', 'pickup -l -t fifo -u')
('6640', 'kdeinit4: konsole [kdeinit]')
('6643', '/bin/bash')
('7451', '/usr/bin/python /usr/bin/ipython')
"""
for pid_path in glob.glob('/proc/[0-9]*/'):
# cmdline represents the command whith which the process was started
f = open("%s/cmdline" % pid_path)
pid = pid_path.split("/")[2] # get the PID
# we replace the \x00 to spaces to make a prettier output from kernel
cmdline = f.read().replace("\x00", " ").rstrip()
f.close()
yield (pid, cmdline)
La verificación de la lista de procesos en ejecución se logra (incluso mediante utilidades centrales como "ps") mirando el contenido del directorio /proc.
Como tal, la biblioteca que le interesa para consultar los procesos en ejecución es la misma que se usa para trabajar con cualquier otro archivo y directorio (es decir, sys
o os
, dependiendo del sabor que busques. Presta especial atención a os.path
sin embargo, hace la mayor parte de lo que buscas). Para terminar o interactuar con los procesos, les envía señales, lo que se logra con os.kill
. Finalmente, inicia nuevos procesos usando os.popen
y amigos.