GNU/Linux >> Tutoriales Linux >  >> Linux

Cambiar el nombre del proceso en Linux

Uno de los comentarios menciona prctl , pero esto realmente merece su propia respuesta, porque configurar argv[0] no funcionará en todos los casos (no hace nada en mi sistema).

Hay al menos dos llamadas de biblioteca para establecer el nombre de un subproceso en Linux, ambas limitadas a 15 caracteres más el NUL de terminación byte:

  1. específico de glibc:pthread_setname_np(...) donde el np significa "no portátil", pero esto podría estar presente en algunos otros sistemas operativos:https://linux.die.net/man/3/pthread_setname_np
  2. Específico de Linux:prctl(PR_SET_NAME...) que tampoco es portátil:https://linux.die.net/man/2/prctl

Ejemplo

Aquí hay una prueba de los diferentes métodos (sin manejo de errores):

// gcc pstest.c -o pstest -O2 -Wall -Wextra -Werror -Wno-unused -Wno-unused-result -std=gnu99 -pthread -D_GNU_SOURCE 
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <sys/prctl.h>

int main(int argc, char *argv[])
{
    puts("Initial ps output:");
    system("ps | grep pstest");

    puts("\npthread_setname_np");
    pthread_setname_np(pthread_self(), "setname");
    system("ps | grep setname");

    puts("\nprctl");
    prctl(PR_SET_NAME, (unsigned long)"prctl", 0, 0, 0);
    system("ps | grep prctl");

    puts("\nargv[0]");
    argv[0] = "argv0";
    system("ps | grep argv0");

    return 0;
}

Observe la falta de salida después de argv[0] :

./pstest
Initial ps output:
17169 pts/0    00:00:00 pstest

pthread_setname_np
17169 pts/0    00:00:00 setname

prctl
17169 pts/0    00:00:00 prctl

argv[0]

En la naturaleza

Aquí hay un ejemplo en código de producción (como siempre, asegúrese de tomar nota de la licencia cuando mire el código en GitHub)

Véase también

Vea también estas preguntas y respuestas:

  • https://unix.stackexchange.com/questions/167490/how-can-a-process-parece-tener-diferente-nombre-en-la-salida-ps
  • ¿Utiliza prctl PR_SET_NAME para establecer el nombre del proceso o subproceso?

Creo que esto debería funcionar, para ilustrar el principio...

#include <stdio.h>

int main(int argc, char *argv[]) {
  argv[0][0] = 65;
  sleep(10);
}

cambiará el nombre, y pondrá una "A" en lugar de la primera letra. CtrlZ para pausar, luego ejecutar ps para ver el nombre cambiado. No tengo idea, pero parece algo peligroso, ya que algunas cosas pueden depender de argv[0] .

Además, intenté reemplazar el puntero en sí mismo por otra cadena; sin cigarro Entonces esto solo funcionaría con strcpy y cadenas más cortas o iguales que el nombre original.

Podría o no haber una mejor manera para esto. No lo sé.

EDITAR:solución no literal:si está bifurcando, conoce el PID del niño (getpid() en el hijo, resultado de fork() en el padre). Simplemente envíelo a algún lugar donde pueda leerlo y mate al niño por PID.

otra solución no literal:haga enlaces suaves al ejecutable con otro nombre (ln -s a.out kill_this_a.out ), luego, cuando ejecute, ejecute el enlace. El nombre será el nombre del enlace.


Este es un truco no portátil:

/*
 * Sets process title, truncating if there is not enough space, 
 * rather than causing memory corruption.
 */
void set_title_np(int argc, char **argv, const char *title) {
    // calculate available size
    size_t space = 0;
    for (int i = 0; i < argc; i++) {
        size_t length = strlen(argv[i]);
        space += length + 1; // because of terminating zero 
    }
    memset(argv[0], '\0', space); // wipe existing args
    strncpy(argv[0], title, space - 1); // -1: leave null termination, if title bigger than space
} 

Según este comentario, prctl(PR_SET_NAME) solo afecta el "nombre corto" de un hilo. Tiene el mismo efecto que escribir en /proc/self/comm .

Para cambiar el "nombre largo" (/proc/self/cmdline que en realidad es utilizado por htop y ps u ) necesitas un truco feo (que se menciona en ese comentario pero el enlace está muerto). Puede encontrar un ejemplo de este tipo de pirateo en el código fuente de Chromium:https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.cc


Linux
  1. 10 RAZONES PARA CAMBIAR WINDOWS 10 A LINUX

  2. UNIX / Linux:Cómo cambiar la amabilidad (prioridad) de un proceso

  3. Nombre del proceso de su pid en Linux

  4. Matar un proceso Java (en Linux) por nombre de proceso en lugar de PID

  5. ¿Usando prctl PR_SET_NAME para establecer el nombre del proceso o subproceso?

Comando matar en Linux

Cómo cambiar la prioridad de un proceso en Linux

Supervisión de procesos en Linux

Cómo cambiar el nombre de Ubuntu Linux gráficamente

Cómo cambiar de usuario en Linux

Cómo cambiar el nombre de host en Debian Linux