GNU/Linux >> Tutoriels Linux >  >> Linux

Changer le nom du processus sous Linux

Un des commentaires mentionne prctl , mais cela mérite vraiment sa propre réponse, car le réglage argv[0] ne fonctionnera pas dans tous les cas (il ne fait rien sur mon système).

Il y a au moins deux appels de bibliothèque pour définir le nom d'un thread sous Linux, tous deux limités à 15 caractères plus le NUL de fin octet :

  1. spécifique à la glibc :pthread_setname_np(...) où le np signifie "non portable", mais cela peut être présent sur d'autres systèmes d'exploitation :https://linux.die.net/man/3/pthread_setname_np
  2. Spécifique à Linux :prctl(PR_SET_NAME...) qui est également non portable :https://linux.die.net/man/2/prctl

Exemple

Voici un test des différentes méthodes (sans gestion d'erreur) :

// 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;
}

Remarquez l'absence de sortie après 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]

Dans la nature

Voici un exemple dans le code de production (comme toujours, assurez-vous de prendre note de la licence lorsque vous regardez le code sur GitHub)

Voir aussi

Voir également ces questions et réponses :

  • https://unix.stackexchange.com/questions/167490/how-can-a-process-appear-to-have-different-name-in-ps-output
  • Utiliser prctl PR_SET_NAME pour définir le nom du processus ou du thread ?

Je pense que cela devrait fonctionner, pour illustrer le principe...

#include <stdio.h>

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

changera le nom, et mettra un "A" à la place de la première lettre. CtrlZ pour faire une pause, puis exécutez ps pour voir le nom changé. Je n'en ai aucune idée, mais cela semble quelque peu dangereux, car certaines choses peuvent dépendre de argv[0] .

De plus, j'ai essayé de remplacer le pointeur lui-même par une autre chaîne ; pas de cigare. Cela ne fonctionnerait donc qu'avec strcpy et des chaînes plus courtes ou égales au nom d'origine.

Il pourrait y avoir ou non un meilleur moyen pour cela. Je ne sais pas.

EDIT :solution non littérale :si vous bifurquez, vous connaissez le PID de l'enfant (getpid() chez l'enfant, résultat de fork() chez les parents). Sortez-le simplement quelque part où vous pouvez le lire et tuez l'enfant par PID.

une autre solution non littérale :créez des liens vers l'exécutable avec un autre nom (ln -s a.out kill_this_a.out ), puis lorsque vous exécutez, exécutez le lien. Le nom sera le nom du lien.


Il s'agit d'un hack non portable :

/*
 * 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
} 

D'après ce commentaire, prctl(PR_SET_NAME) n'affecte que le "nom court" d'un fil. Cela a le même effet que d'écrire dans /proc/self/comm .

Pour changer le "nom long" (/proc/self/cmdline qui est réellement utilisé par htop et ps u ) vous avez besoin d'un hack moche (qui est mentionné dans ce commentaire mais le lien est mort). Un exemple de ce type de piratage peut être trouvé dans le code source de Chromium :https://source.chromium.org/chromium/chromium/src/+/master:content/common/set_process_title_linux.cc


Linux
  1. Changer le nom d'utilisateur sous Linux

  2. UNIX / Linux :Comment changer la gentillesse (priorité) d'un processus

  3. Redémarrer le processus lors du changement de fichier sous Linux

  4. La commande Linux obtient l'identifiant du processus tomcat par son nom

  5. Nom du processus à partir de son pid sous Linux

Commande Kill sous Linux

Comment changer la priorité d'un processus sous Linux

Surveillance des processus sous Linux

Comment changer graphiquement le nom d'Ubuntu Linux

Comment changer d'utilisateur sous Linux

Comment changer le nom d'hôte sur Debian Linux