¿Puedo cambiar el nombre de proceso efectivo de una secuencia de comandos de Python? Quiero mostrar un nombre diferente en lugar del nombre real del proceso cuando obtengo la lista de procesos del sistema. En CI se puede configurar
strcpy(argv[0],"othername");
Pero en Python
argv[0] = "othername"
no parece funcionar. Cuando obtengo la lista de procesos ( 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 Windows), si existe.
Gracias por adelantado
Respuestas:
En pocas palabras, no existe una forma portátil. Tendrá que probar el sistema y utilizar el método preferido para ese sistema.
Además, estoy confundido acerca de lo que quiere decir con nombres de procesos en Windows.
¿Te refieres a un nombre de servicio? Supongo que sí, porque nada más realmente tiene sentido (al menos para mi cerebro que no usa Windows).
Si es así, debe 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ó a excepción de este módulo mal empaquetado que establece argv [0] para usted.
Ni siquiera sé si esto funcionará en variantes de BSD (que tiene una llamada al sistema setproctitle). Estoy bastante seguro de que argv [0] no funcionará en Solaris.
fuente
Recientemente escribí un módulo de Python para cambiar el título del proceso de forma portátil: consulte 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 con Linux y Mac OS X: Windows (con funcionalidad limitada) y las adaptaciones 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 se ha adaptado a Python 3.x.
fuente
en realidad, necesitas 2 cosas en Linux: modificar
argv[0]
desdeC
(paraps auxf
y amigos) y llamarprctl
conPR_SET_NAME
bandera.No hay absolutamente ninguna forma de hacer la primera pieza desde Python. Aunque, puede 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 :(. Perotop
yps -A
mostrará un nuevo nombre de proceso 'testing sí' :). Tambiénkillall
ypkill
funcionará con nuevo nombre.por cierto, procname de googlecode también cambia
argv[0]
, por lo tanto, incluso, cambia laps auxf
salida.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 de linux y freebsd. ¡No falla hasta ahora! ¡Todos deberían también! :). Utiliza casi el mismo código que utiliza PostgreSQL en su base de datos principal y procesos secundarios.
fuente
Eche un vistazo al paquete setproctitle
Esta es una versión bastante portátil y funciona en muchas plataformas.
import setproctitle setproctitle.setproctitle('new proc title as seen in top')
fuente
setproctitle
. Una verdadera solución de Windows probablemente sea difícil.Primero, no estoy seguro de que simplemente la configuración
argv[0]
en un programa C cambie de manera portátil el nombre que se muestra enps
. Tal vez lo haga en algún unixen, pero tengo entendido que no se espera que lo haga.En segundo lugar, dado que Windows no es compatible específicamente con POSIX, solo algunas cosas son "portátiles" entre POSIX y no POSIX. Dado que dice específicamente 'ps', asumiré que POSIX es su prioridad y que Windows puede no funcionar.
Más importante aún, mi comprensión del cambio
argv[0]
es que requiere un llamadoexec
para realizar estos cambios. Específicamente, laexec
llamada tiene una ruta a un ejecutable y unaargv
lista separada . Hacer su propia llamada le permite romper la convención de shell de poner el nombre del ejecutableargv[0]
.Tiene una gestión de procesos de la biblioteca del sistema operativo que le da acceso directo a la biblioteca del sistema operativo para hacer esto. Debería considerar dividir su guión en dos partes: un comienzo y el "trabajo real". El arrancador establece el entorno de tiempo de ejecución y el ejecutivo realiza el trabajo real 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 un argv [0] diferente. Con suerte, no se resistirá a esto. Algunos programas comprueban argv [0] para decidir qué están haciendo.
También tiene subprocess.popen que puede usar para configurar los argumentos y ejecutables que desee. En este caso, sin embargo, el proceso principal debe demorarse para recoger al niño cuando el niño termina. Es posible que el padre no esté haciendo nada más que un
Popen.wait
fuente
Mi respuesta a una pregunta similar marcada como duplicada :
Hay una forma más simple (no necesita importar ninguna biblioteca) pero tal vez no sea tan elegante. No tienes que usar "env" dentro de la línea shebang.
En otras palabras, esto se denominará "python" en la lista de procesos:
#!/usr/bin/env python
Pero esto se nombrará con su nombre de script:
#!/usr/bin/python
Entonces podrás encontrarlo con algo como
pidof -x scriptname
ops -C scriptname
fuente
He descubierto que python-prctl funciona muy bien en Linux. Tendrá que encontrar algo más para Windows.
fuente
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 signo único '='
fuente