¿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.