GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo puede parecer que un proceso tiene un nombre diferente en la salida de ps?

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


Linux
  1. ¿Cómo obtener solo todos los ID de proceso en ejecución?

  2. ¿Cómo identificar el puerto de un proceso?

  3. ¿Cómo puedo ver la salida de dmesg a medida que cambia?

  4. ¿Puede un proceso tener un propietario? ¿Qué significa?

  5. ¿Cómo ordenar la salida de ps por hora de inicio del proceso?

Cómo encontrar un nombre de proceso usando el número PID en Linux

Cómo encontrar el nombre del proceso a partir de su PID

¿Cómo obtener solo la ID del proceso en especificar el nombre del proceso en Linux?

¿Cómo puedo hacer que tcpdump escriba en el archivo y genere de forma estándar los datos apropiados?

¿Cómo obtener PID por nombre de proceso?

Si conozco el número PID de un proceso, ¿cómo puedo obtener su nombre?