
Nachdem ich Mosh verwendet hatte, bemerkte ich, dass die von gehaltenen UDP-Ports mosh-server
nach dem Beenden aller Prozesse immer noch verwendet wurden.
Beim Ausführen netstat -ln
wird angezeigt, dass die folgenden Ports verwendet werden:
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (state)
udp4 0 0 10.0.106.61.60002 *.*
udp4 0 0 10.0.106.61.61006 *.*
Da es sich um OS X handelt, netstat -p
wird das Flag nicht unterstützt, daher kann ich die PID des Prozesses nicht finden, dahttps://stackoverflow.com/a/3855359weist darauf hin. Stattdessen führe ich aus sudo lsof -i :61006
, was nichts zurückgibt.
Okay … vielleicht kann ich alle offenen Dateien mit numerischen Ports und Hostnamen auflisten und sie mit Greep durchsuchen? sudo lsof -i -n -P | grep 61006
… Nein, schon wieder nichts.
Natürlich werden diese Ports beim Neustart bereinigt ... Die Herausforderung besteht hier jedoch darin, sie zu diagnostizieren und freizugeben, ohne einen Neustart durchzuführen.
Irgendwelche Ideen?
Antwort1
Etwas mehr als ein Jahr später stieß ich erneut auf dieses Problem, diesmal jedoch mit einer tieferen Diagnose. Diesmal war der Phantom-Port-gebundene Prozess Java und nicht Mosh und verwendete TCP statt UDP. In diesem Fall befand sich der Prozess in einem „Beenden“-Zustand und konnte überhaupt nicht beendet werden, außer durch einen Systemneustart.
Bei der Diagnose habe ich einige interessante Punkte entdeckt:
netstat
Es ist möglich, die PID mithilfe des Flags anzuzeigen-v
:$ netstat -avn Active Internet connections (including servers) Proto Recv-Q Send-Q Local Address Foreign Address (state) rhiwat shiwat pid epid ... tcp4 0 0 *.6000 *.* LISTEN 131072 131072 50207 0
Der Prozess 50207, der in angezeigt wird
netstat
,nichterscheinen in allen Varianten vonlsof
, mit oder ohnesudo
. Dies ist das gleiche Verhalten, das in der Frage dokumentiert ist.Der Prozess konnte nicht einmal mit beendet werden
sudo kill -9
! Bei der Überprüfung seines Eintrags inps
scheint er sich in einem interessanten „Beenden“-Zustand zu befinden, der „?E“ entspricht:$ ps aux USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND ... mxxk 50207 0.0 0.0 0 0 ?? ?E 5Aug19 0:00.00 (java)
Wie dokumentiert inhttps://serverfault.com/questions/85799/how-to-kill-an-exiting-process-on-os-x-state-e, es scheint, dass die einzige Möglichkeit, einen laufenden Prozess unter MacOS zu beenden, ein Neustart ist. (Ich bin nicht sicher, ob sich Linux anders verhält.)
All dies wurde auf MacOS High Sierra (10.13.6) durchgeführt.