Wie kann ich den Befehlstitel beim Ausführen eines Servers ändern?

Wie kann ich den Befehlstitel beim Ausführen eines Servers ändern?

Ich versuche, die Ausgabe so zu ändern, lsof -i4TCP:PORTdass sie einen benutzerdefinierten Namen enthält. Dadurch kann ich den Serverprozess leichter als von meinem Daemon gestartet identifizieren. Unten sehen Sie ein Bild mit einem Pfeil, der auf das zeigt, was ich steuern möchte.

Ich habe ein benutzerdefiniertes Gem erstellt, den Prozess dort ausgeführt und es heißt immer noch Ruby. Anstatt mich in das „Kaninchenloch“ zu begeben, frage ich mich, ob jemand anderes dieses Bedürfnis hatte. Ich möchte im Wesentlichen genau das tun, was Docker getan hat, und den Prozess mit meinem Programmnamen markiert anzeigen.

LSOF-Ausgabe

Antwort1

Sie müssen den Prozessnamen festlegen. Auf einigen Systemen $0würde die Zuweisung eines Wertes funktionieren, aber nicht unter Linux (zumindest nicht mit meiner Version von ruby), wo rubynur die Argumentliste festgelegt wird (wie in ps -foder zu sehen ps -o args), nicht aber der Prozessname (wie in lsofoder ps/ ps -o comm) ( perl -e '$0 = "foo"'würde funktionieren, da perlsowohl der Prozessname als auch die Argumentliste festgelegt wird).

Dazu müssen Sie unter Linux Folgendes tun:

prctl(PR_SET_NAME, "newname")

Systemaufruf.

Sie könnten Folgendes tun:

$ ruby -e 'syscall(157, 15, "foo"); system("ps")'
  PID TTY          TIME CMD
5679 pts/4    00:00:01 zsh
8639 pts/4    00:00:00 foo
8641 pts/4    00:00:00 ps

Der Wert des Systemaufrufs wäre architekturabhängig (hier 157 für amd64).

Das Suchen nach prctlim Quellcode von rubybringt jedoch nichts, daher vermute ich, dass in keine standardmäßige Unterstützung dafür vorhanden ist ruby. Process.setproctitle()Außerdem wird der Prozessname nicht festgelegt.

@Jessehz auf SO hat eine Lösung mitfiddlepctrl()um die Funktion in der C-Bibliothek aufzurufen ( rubyich nehme an, es wird eine dynamische Verknüpfung vorausgesetzt):

$ ruby -e 'require "fiddle"; Fiddle::Function.new(
  Fiddle::Handle["prctl".freeze], [Fiddle::TYPE_INT, Fiddle::TYPE_VOIDP],
  Fiddle::TYPE_INT).call(15, "foo"); system("ps")'
  PID TTY          TIME CMD
 5931 pts/5    00:00:02 zsh
 8943 pts/5    00:00:00 foo
 8945 pts/5    00:00:00 ps

Antwort2

Danke an @Stéphane für die tolle Antwort. Aber in meinem Fall war die beste Lösung, meine Skripte als Mac OSX-App zu bündeln. Sie können Ihren Prozessnamen in der Info.plist Ihres Projekts steuern.

verwandte Informationen