una tiempo proceso medir libreria funcion ejemplos ejecucion como comando capturar calcular python process mosix

tiempo - Cómo decir el ID del proceso dentro de Python



tiempo de proceso python (3)

Utilice el módulo de subprocess . Popen instancias de Popen tienen un atributo pid .

Estoy trabajando con un sistema de clúster sobre Linux (www.mosix.org) que me permite ejecutar trabajos y hacer que el sistema los ejecute en diferentes computadoras. Los trabajos se ejecutan así:

mosrun ls &

Esto creará el proceso de forma natural y lo ejecutará en segundo plano, devolviendo la identificación del proceso, así:

[1] 29199

Más tarde volverá. Estoy escribiendo una infraestructura de Python que ejecutaría trabajos y los controlaría. Para eso quiero ejecutar trabajos utilizando el programa mosrun como se indica anteriormente, y guardar el ID del proceso engendrado (29199 en este caso). Esto, naturalmente, no se puede hacer utilizando os.system o commands.getoutput, ya que la identificación impresa no es lo que el proceso imprime para dar salida ... ¿Alguna pista?

Editar :

Dado que el script de python solo pretende ejecutar el script inicialmente, los scripts deben ejecutarse más tiempo que el shell de python. Supongo que significa que el proceso de mosrun no puede ser el proceso secundario del script. ¿Alguna sugerencia?

Gracias


Parece que quiere asegurarse de que el proceso secundario se demoniza : PEP 3143, que estoy señalando, documenta y apunta a una implementación de referencia para eso, y apunta a otros también.

Una vez que su proceso (aún ejecutando el código de Python) se demoniza, ya sea por los medios ofrecidos en PEP 3143 u otros, puede os.execl (u otra función os.exec... ) su código objetivo - esto ejecuta dicho código objetivo en exactamente el mismo proceso que acabamos de decir que está demonizado, y así sigue siendo demonizado, como se desea.

El último paso no puede usar el subprocess porque necesita ejecutarse en el mismo proceso (daemonizado), superponiendo su código ejecutable, exactamente para qué son os.execl y sus amigos.

El primer paso, antes de la daemonización, podría concebirse a través de un subprocess , pero eso es un poco inconveniente (debe poner el código daemonize-then-os.exec en un .py separado): lo más habitual es que quiera os.fork e inmediatamente daemonize el proceso del niño.

subprocess es bastante conveniente como una forma de plataforma cruzada para ejecutar otros procesos, pero realmente no puede reemplazar el viejo enfoque de "fork and exec" de Unix para usos avanzados (como la demonización, en este caso), razón por la cual ¡es bueno que la biblioteca estándar de Python también te permita hacer lo último a través de esas funciones en el módulo os ! -)


Gracias por toda la ayuda. Esto es lo que hice al final, y parece funcionar bien. El código usa python-daemon . Tal vez debería hacerse algo más inteligente para transferir la identificación del proceso del niño al padre, pero esa es la parte más fácil.

import daemon def run_in_background(command, tmp_dir="/tmp"): # Decide on a temp file beforehand warnings.filterwarnings("ignore", "tempnam is a potential security") tmp_filename = os.tempnam(tmp_dir) # Duplicate the process pid = os.fork() # If we''re child, daemonize and run if pid == 0: with daemon.DaemonContext(): child_id = os.getpid() file(tmp_filename,''w'').write(str(child_id)) sp = command.split('' '') os.execl(*([sp[0]]+sp)) else: # If we''re a parent, poll for the new file n_iter = 0 while True: if os.path.exists(tmp_filename): child_id = int(file(tmp_filename, ''r'').read().strip()) break if n_iter == 100: raise Exception("Cannot read process id from temp file %s" % tmp_filename) n_iter += 1 time.sleep(0.1) return child_id