Das Manipulieren des Namens in der Prozessliste ist eine gängige Praxis. Z.B. Ich habe in meinem Prozess folgendes aufgelistet:
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 verwendet diesen Mechanismus, um auf einfache Weise anzuzeigen, was jeder Prozess tut.
Es ist im Grunde so einfach wie die Manipulation von argv[0]
Parameter in C. argv
ist ein Array von Zeigern auf die Parameter, mit denen der Prozess gestartet wurde. Also ein Befehl ls -l /some/directory
wird haben:
argv[0] -> "ls"
argv[1] -> "-l"
argv[2] -> "/some/directory"
argv[3] -> null
Indem etwas Speicher zugewiesen wird, etwas Text in diesen Speicher geschrieben wird und dann die Adresse dieses Speichers in argv[0]
eingefügt wird Der angezeigte Prozessname wurde an den neuen Text angepasst.
Das Ändern von argv[] ist nicht portabel. Unter Linux können Sie argv[0] auch nicht einfach so ändern, dass es auf eine längere Zeichenfolge zeigt. Sie müssten die vorhandenen Argumente überschreiben und darauf achten, die im Adressraum folgenden Umgebungsvariablen nicht zu überschreiben.
libbsd bietet eine Implementierung von setproctitle(3) für Linux, die dies viel einfacher macht.
Dazu gibt es zwei Linux-Standardwege, von denen einer von glibc kommt und möglicherweise auf andere Nicht-Linux-Systeme portierbar ist:
- glibc
pthread_setname_np()
ist wahrscheinlich die bessere Methode - Linux
prctl()
geht auch
Es ist möglich, dass argv[0]
geändert wird Früher hat es funktioniert, aber zumindest auf meinem aktuellen Linux-System ändert es nichts an der Ausgabe in ps
.
Weitere Einzelheiten und ein Codebeispiel finden Sie in dieser Antwort:https://stackoverflow.com/a/55584492/737303