2009-11-10 17 views
13

A través de mi interfaz web me gustaría iniciar/detener ciertos procesos y determinar si un proceso iniciado aún se está ejecutando.Biblioteca de Python para la gestión de procesos de Linux

Mi sitio web existente está basado en Python y se ejecuta en un servidor Linux, así que ¿conoce una biblioteca adecuada que admita esta funcionalidad?

Gracias

Respuesta

13

para iniciar/detener procesos sub pitón puede utilizar el módulo de subproceso. Para comprobar si se están ejecutando es posible utilizar psutil:

>>> import psutil 
>>> pid = 1034 # some pid 
>>> psutil.pid_exists(pid) 
True 
>>> 

... o esto (que también comprobará si el PID se ha reutilizado):

>>> p = psutil.Process(pid) 
>>> p.is_running() 
True 
>>> 
1

El módulo os es probablemente tu amigo. Hay os.kill, por ejemplo, para matar un proceso.

En términos de obtener una lista de procesos, es probable que desee desmantelar el comando ps. This question tiene más información sobre eso.

+0

sí estoy idealmente después de un biblioteca de nivel más alto que analizar manualmente ps – hoju

+2

Ejecutar el comando 'ps' dentro de una cáscara es mucho más peligrosa que la nota de tylerl sobre el uso de/proc. Haz eso en cambio. –

+0

¿cómo puede ser peligroso? – hoju

6

La comprobación de la lista de procesos en ejecución se lleva a cabo (incluso mediante utilidades principales como "ps") mirando los contenidos del directorio/proc.

Como tal, la biblioteca que le interesa para la consulta de los procesos en ejecución es el mismo que se utiliza para trabajar con otros archivos y directorios (es decir sys o os, dependiendo del sabor que está buscando. Prestar especial atención a os.path sin embargo, hace la mayor parte de lo que buscas). Para terminar o interactuar de alguna otra manera con los procesos, envíeles señales, lo que se logra con os.kill. Finalmente, inicie nuevos procesos utilizando os.popen y amigos.

2

ya que dijo que este es un servidor Linux, llamando a la ps externa binaria es por lo general más lento, consume más recursos y es más propenso a errores que el uso de la información de /proc directamente.

Puesto que nadie más ha mencionado, de una manera sencilla es:

glob.glob('/proc/[0-9]*/') 

Buena suerte.

2

Esto es lo que uso. Utiliza procfs (por lo que está limitado a Unix como sistemas, no funcionará en Mac, creo) y el glob mencionado anteriormente. También obtiene la línea de cm, que le permite identificar el proceso. Para matar el proceso, puede usar os.kill(signal.SIGTERM, pid). Para el uso de sub-proceso, por favor marque este post Python, Popen and select - waiting for a process to terminate or a timeout

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) 
0

que haría uso de PSutil.Para proporcionar un ejemplo práctico:

import psutil 

for proc in psutil.get_process_list(): 
    if proc.username == 'yourusername': 
     if myappname in proc.cmdline: 
      print 'App is running' 

Alternativamente, Red Hat uso y mantener un módulo de Python llamado pitón-linux-procfs, que analiza de forma nativa/proc, para gestionar los procesos. no está muy publicitado, pero proporciona algunas características adicionales específicas de Linux (por ejemplo, clase de programación) que a veces son útiles.

http://pkgs.fedoraproject.org/gitweb/?p=python-linux-procfs.git

Cuestiones relacionadas