GNU/Linux >> Tutoriels Linux >  >> Linux

Comment un processus peut-il apparaître comme ayant un nom différent dans la sortie ps ?

La manipulation du nom dans la liste des processus est une pratique courante. Par exemple. J'ai dans mon processus la liste suivante :

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 utilise ce mécanisme pour montrer facilement ce que fait chaque processus.

C'est fondamentalement aussi simple que de manipuler le argv[0] paramètre en C. argv est un tableau de pointeurs vers les paramètres avec lesquels le processus a été lancé. Donc une commande ls -l /some/directory aura :

argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null

En allouant de la mémoire, en mettant du texte dans cette mémoire, puis en mettant l'adresse de cette mémoire dans argv[0] le nom du processus affiché aura été modifié avec le nouveau texte.


Changer argv[] n'est pas portable. Sous Linux, vous ne pouvez pas non plus simplement modifier argv[0] pour pointer vers une chaîne plus longue. Vous devrez écraser les arguments existants et veiller à ne pas écraser les variables d'environnement qui suivent dans l'espace d'adressage.

libbsd fournit une implémentation de setproctitle(3) pour Linux qui rend cela beaucoup plus facile.


Il existe deux manières standard Linux de le faire, dont l'une provient de la glibc et peut être portable sur d'autres systèmes non Linux :

  • glibc pthread_setname_np() est probablement la meilleure méthode
  • Linux prctl() fonctionne aussi

Il est possible que la modification de argv[0] fonctionnait auparavant, mais au moins sur mon système Linux actuel, cela ne fait rien à la sortie en ps .

Voir cette réponse pour plus de détails et un exemple de code :https://stackoverflow.com/a/55584492/737303


Linux
  1. Comment faire en sorte que `date` affiche l'heure d'un fuseau horaire différent ?

  2. Comment puis-je tuer un processus par nom au lieu de PID?

  3. Quel est le but de chacun des différents UID qu'un processus peut avoir ?

  4. Comment obtenir uniquement l'ID de processus en spécifiant le nom du processus sous Linux?

  5. Comment puis-je faire en sorte que tcpdump écrive dans un fichier et que la sortie standard affiche les données appropriées?

Comment trouver un nom de processus à l'aide d'un numéro PID sous Linux

Comment trouver le nom du processus à partir de son PID

Si je connais le numéro PID d'un processus, comment puis-je obtenir son nom ?

Comment trier la sortie ps par heure de début de processus ?

Comment puis-je trier la sortie du -h par taille

lsof - limiter la sortie aux fichiers physiques uniquement - comment ?