2009-02-19 16 views
58

¿Puedo cambiar el nombre del proceso efectivo de un script de Python? Quiero mostrar un nombre diferente en lugar del nombre real del proceso cuando obtengo la lista de procesos del sistema. En C puedo configurar¿Hay alguna manera de cambiar el nombre del proceso efectivo en Python?

strcpy(argv[0],"othername"); 

Pero en Python

argv[0] = "othername" 

no parecen funcionar. Cuando obtengo la lista de procesos (con ps ax en mi cuadro de Linux), el nombre real no cambia. Prefiero una solución portátil (o una solución para posix y otra para entornos de Windows), si existe.

Gracias de antemano

+0

ver también https://superuser.com/questions/427642/is-it-possible-to-set-the-process-name-with-pythonw, donde http: // bugs.python.org/issue5672 soy yo ntionned – anarcat

Respuesta

10

En pocas palabras, no hay manera portátil. Deberá probar el sistema y usar el método preferido para ese sistema.

Además, estoy confundido acerca de lo que quiere decir con nombres de procesos en Windows.

¿Se refiere a un nombre de servicio? Supongo que sí, porque nada más tiene sentido (al menos para mi cerebro que no usa Windows).

Si es así, debe utilizar Tim Golden's WMI interface y llamar al método .Change en el servicio ... al menos según su tutorial.

Para Linux ninguno de los métodos que encontré funcionó excepto this poorly packaged module que establece argv [0] para usted.

Ni siquiera sé si esto funcionará en las variantes BSD (que tiene una llamada al sistema setproctitle). Estoy bastante seguro de que argv [0] no funcionará en Solaris.

+0

Sé que es tarde, pero para los lectores nuevos, considere también @MattWritesCode [answer] (http://stackoverflow.com/a/13267122/248390), rápido y simple para CPython en Linux. – bufh

-8
In [1]: import sys 

In [2]: print sys.argv[0] 
C:\Python25\scripts\ipython.py 

In [3]: sys.argv[0] = 'foo' 

In [4]: print sys.argv[0] 
foo 

nota el single '=' signo

+2

Pero si ejecuto ps (lista de procesos en linux boxes) el nombre del proceso permanece exactamente igual. Pruebe – Emilio

+1

, así que, en lugar de rechazar mi respuesta, intente aclarar este punto en su pregunta. ... –

+2

Esto no cambia el nombre del proceso en absoluto. Solo cambia la copia de argv de Python. Yo recomendaría eliminar esta respuesta obviamente incorrecta. – Dakkaron

4

En primer lugar, no estoy seguro de que simplemente ajustes argv[0] en un programa de C cambia de forma portátil el nombre se muestra en ps. Tal vez lo haga en un unixen, pero mi entendimiento es que no se espera que lo haga.

En segundo lugar, dado que Windows es específicamente no compatible con POSIX, solo algunas cosas son "portátiles" entre POSIX y no POSIX. Como dice específicamente 'ps', supongo que POSIX es su prioridad y Windows puede no funcionar.

Más importante aún, mi comprensión de cambiar argv[0] es que requiere una llamada al exec para realizar estos cambios. Específicamente, la llamada exec tiene una ruta a un ejecutable y una lista separada de argv. Hacer su propia llamada le permite romper la convención del shell de poner el nombre del ejecutable en argv[0].

Tiene OS library process management que le da acceso directo a la biblioteca del sistema operativo para hacer esto. Deberías considerar romper tu guión en dos partes: un comienzo y el "trabajo real". El iniciador establece el entorno de tiempo de ejecución y el trabajo real del ejecutor con los parámetros deseados.

En C, está reemplazando su propio proceso por otro. En Python, está reemplazando el antiguo intérprete de Python por uno nuevo que tiene una argv diferente [0]. Con suerte, no se negará a esto. Algunos programas comprueban argv [0] para decidir qué están haciendo.

También tiene subprocess.popen que puede usar para configurar los args deseados y el ejecutable. En este caso, sin embargo, el proceso principal debe permanecer para recoger al niño cuando el niño termine. El padre no puede estar haciendo nada más que Popen.wait

+1

No, cambiar argv en Linux (y probablemente otros Unixes, pero no todos) cambia inmediatamente el nombre del proceso visible, que es utilizado por muchos programas ampliamente utilizados para dar nombres descriptivos para sus procesos: tanto ssh como postgres hacen esto, y algunos cambian activamente su nombre sobre la marcha para indicar su estado actual. Se podría escribir un módulo de Python para hacer esto, utilizando la llamada API Py_GetArgcArgv. –

45

realidad se necesitan 2 cosas en Linux: modificar argv[0] de C (por ps auxf y amigos) y llamar prctl con PR_SET_NAME bandera.

No hay absolutamente ninguna manera de hacer la primera pieza de la propia pitón. Aunque, puede simplemente cambiar el nombre del proceso llamando a prctl.

def set_proc_name(newname): 
    from ctypes import cdll, byref, create_string_buffer 
    libc = cdll.LoadLibrary('libc.so.6') 
    buff = create_string_buffer(len(newname)+1) 
    buff.value = newname 
    libc.prctl(15, byref(buff), 0, 0, 0) 

def get_proc_name(): 
    from ctypes import cdll, byref, create_string_buffer 
    libc = cdll.LoadLibrary('libc.so.6') 
    buff = create_string_buffer(128) 
    # 16 == PR_GET_NAME from <linux/prctl.h> 
    libc.prctl(16, byref(buff), 0, 0, 0) 
    return buff.value 

import sys 
# sys.argv[0] == 'python' 

# outputs 'python' 
get_proc_name() 

set_proc_name('testing yeah') 

# outputs 'testing yeah' 
get_proc_name() 

ps auxf mostrará sólo 'pitón' después de eso :(. Pero top y ps -A mostrará nueva 'sí pruebas' nombre del proceso :). También killall y pkill funcionarán con un nuevo nombre.

por cierto, procname de googlecode también cambia argv[0], así, incluso, cambia ps auxf salida.

ACTUALIZACIÓN: La solución publicada en esta respuesta no funciona bien a veces en FreeBSD. Ahora estoy usando py-setproctitle declaró in this answer durante un año más o menos en varias cajas linux y freebsd. ¡No falla hasta ahora! ¡Todos deberían también! :). Utiliza casi el mismo código que PostgreSQLuses en su base de datos principal y procesos secundarios.

+0

procname no funciona en PyPy (solo en CPython) tiene que usar setproctitle. – radtek

67

que he escrito recientemente un módulo de Python para cambiar el título de proceso de una manera portátil: comprobar https://github.com/dvarrazzo/py-setproctitle

Es una envoltura alrededor del código utilizado por PostgreSQL para realizar el cambio de título. Actualmente se prueba contra Linux y Mac OS X: Windows (con funcionalidad limitada) y los puertos BSD están en camino.

Edición: a partir de julio de 2010, el módulo funciona con BSD y con funcionalidad limitada en Windows, y se ha portado a Python 3.x.

+0

No se puede instalar en Windows. – user

+0

@user, no importa: no es muy útil en Windows, pero no hay mucho que hacer al respecto. – piro

+0

¿Hay alguna manera de cambiar los argumentos mostrados por ps -f? Realmente no me importa el nombre del programa (siempre Python), pero quiero cambiar los argumentos mostrados. – KillianDS

5

echar un vistazo a setproctitle paquete

Esto es absolutamente una versión portátil y funciona en muchas plataformas.

0

He encontrado python-prctl para trabajar muy bien en Linux. Tendrás que encontrar algo más para Windows.

2

Mi respuesta a pregunta similar marcado como duplicate:

Hay más simple (que no es necesario importar cualquier librería) pero forma tal vez no tan elegante. No debe usar "env" dentro de la línea shebang.

En otras palabras, este será nombrado como "pitón" en la lista de procesos:

#!/usr/bin/env python 

Pero esto será nombrado con su scriptname:

#!/usr/bin/python 

por lo que será capaz de encontrarlo con algo como pidof -x scriptname o ps -C scriptname

Cuestiones relacionadas