
Ich versuche, die Ausgabe so zu ändern, lsof -i4TCP:PORT
dass 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.
Antwort1
Sie müssen den Prozessnamen festlegen. Auf einigen Systemen $0
würde die Zuweisung eines Wertes funktionieren, aber nicht unter Linux (zumindest nicht mit meiner Version von ruby
), wo ruby
nur die Argumentliste festgelegt wird (wie in ps -f
oder zu sehen ps -o args
), nicht aber der Prozessname (wie in lsof
oder ps
/ ps -o comm
) ( perl -e '$0 = "foo"'
würde funktionieren, da perl
sowohl 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 prctl
im Quellcode von ruby
bringt 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 mitfiddle
pctrl()
um die Funktion in der C-Bibliothek aufzurufen ( ruby
ich 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.