python process arguments hide ps

¿Hay alguna manera de cambiar el nombre del proceso efectivo en Python?



process arguments (8)

¿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 CI puede establecer

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

Pero en Python

argv[0] = "othername"

no parece 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 por adelantado


En primer lugar, no estoy seguro de que simplemente la configuración argv[0] en un programa C cambie de forma portátil el nombre que 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 hacer estos cambios. Específicamente, la llamada exec tiene una ruta a un ejecutable y una lista de archivos de argv separado. Hacer su propia llamada le permite romper la convención de shell de poner el nombre del ejecutable en argv[0] .

Tiene una administración de proceso de biblioteca de SO 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 starter establece el entorno de tiempo de ejecución y el trabajo real del ejecutor con los parámetros deseados.

En C, estás reemplazando tu propio proceso con 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 y ejecutables deseados. En este caso, sin embargo, el proceso principal debe permanecer para recoger al niño cuando el niño termine. El padre no puede hacer nada más que un Popen.wait


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

Tenga en cuenta el único signo ''=''


Eche un vistazo al paquete setproctitle

Esta es una versión bastante portátil y funciona en muchas plataformas.


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


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

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

¿Te refieres 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í, debes usar la interfaz WMI de Tim Golden y llamar al método .Change en el servicio ... al menos de acuerdo con su tutorial .

Para Linux ninguno de los métodos que encontré funcionó excepto este módulo mal empaquetado 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.


Recientemente escribí un módulo de Python para cambiar el título del proceso de manera portátil: compruebe https://github.com/dvarrazzo/py-setproctitle

Es un envoltorio 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.

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


Mi respuesta a una pregunta similar marcada como duplicada :

Hay simplier (no es necesario importar ninguna libs) pero tal vez no sea tan elegante. No debe usar "env" dentro de la línea shebang.

En otras palabras, esto se llamará "python" en la lista de procesos:

#!/usr/bin/env python

Pero esto se nombrará con su nombre de script:

#!/usr/bin/python

Así que podrás encontrarlo con algo como pidof -x scriptname o ps -C scriptname


en realidad necesitas 2 cosas en Linux: modifica argv[0] desde C (para ps auxf y amigos) y llama a prctl con el indicador PR_SET_NAME .

No hay absolutamente ninguna forma 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á solo ''python'' después de eso :(. Pero top y ps -A mostrará el nuevo ''test yeah'' nombre del proceso :). También killall y pkill trabajarán con un nuevo nombre.

Por cierto, procname de googlecode también cambia argv[0] , por lo tanto, incluso, cambia la salida ps auxf .

ACTUALIZACIÓN : la solución publicada en esta respuesta no funciona bien a veces en FreeBSD. Ahora estoy usando py-setproctitle indicado en esta respuesta 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 PostgreSQL usa en su base de datos principal y procesos secundarios.