Manipular el nombre en la lista de procesos es una práctica común. P.ej. Tengo en mi proceso una lista de lo siguiente:
root 9847 0.0 0.0 42216 1560 ? Ss Aug13 8:27 /usr/sbin/dovecot -c /etc/dovecot/d
root 20186 0.0 0.0 78880 2672 ? S Aug13 2:44 \_ dovecot-auth
dovecot 13371 0.0 0.0 39440 2208 ? S Oct09 0:00 \_ pop3-login
dovecot 9698 0.0 0.0 39452 2640 ? S Nov07 0:00 \_ imap-login
ericb 9026 0.0 0.0 48196 7496 ? S Nov11 0:00 \_ imap [ericb 192.168.170.186]
Dovecot usa este mecanismo para mostrar fácilmente lo que está haciendo cada proceso.
Es básicamente tan simple como manipular el argv[0]
parámetro en C. argv
es una matriz de punteros a los parámetros con los que se ha iniciado el proceso. Entonces un comando ls -l /some/directory
tendrá:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Al asignar algo de memoria, poner algo de texto en esa memoria y luego poner la dirección de esa memoria en argv[0]
el nombre del proceso que se muestra se habrá modificado con el nuevo texto.
Cambiar argv[] no es portátil. En Linux, tampoco puede simplemente cambiar argv[0] para que apunte a una cadena más larga. Tendría que sobrescribir los argumentos existentes y tener cuidado de no sobrescribir las variables de entorno que siguen en el espacio de direcciones.
libbsd proporciona una implementación de setproctitle(3) para Linux que lo hace mucho más fácil.
Hay dos formas estándar de Linux para hacer esto, una de las cuales proviene de glibc y podría ser portátil a otros sistemas que no sean Linux:
- glibc
pthread_setname_np()
es probablemente el mejor método - Linux
prctl()
también funciona
Es posible que cambiando argv[0]
solía funcionar, pero al menos en mi sistema Linux actual no hace nada en la salida en ps
.
Consulte esta respuesta para obtener más detalles y un ejemplo de código:https://stackoverflow.com/a/55584492/737303