GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie kann ein Prozess in der ps-Ausgabe einen anderen Namen haben?

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


Linux
  1. Wie kann `date` die Uhrzeit aus einer anderen Zeitzone ausgeben?

  2. So leiten Sie die Ausgabe eines bereits laufenden Prozesses um

  3. Wie bekomme ich nur die Prozess-ID unter Angabe des Prozessnamens in Linux?

  4. Wie kann ich tcpdump in eine Datei schreiben und die entsprechenden Daten standardmäßig ausgeben lassen?

  5. Woher weiß ich, welcher Prozess Swap verwendet?

So finden Sie einen Prozessnamen mithilfe der PID-Nummer in Linux

So finden Sie den Prozessnamen anhand seiner PID

Wie bekomme ich PID nach Prozessname?

Wenn ich die PID-Nummer eines Prozesses kenne, wie erhalte ich seinen Namen?

Wie identifiziere ich einen Port zu einem Prozess?

lsof - Ausgabe nur auf physische Dateien beschränken - wie?