Sie stellen hier die falsche Frage. Es ist nicht wirklich möglich, einen Port einfach von außerhalb der Anwendung zu "schließen", die den Socket geöffnet hat, der ihn abhört. Die einzige Möglichkeit, dies zu tun, besteht darin, den Prozess, dem der Port gehört, vollständig zu beenden. In ein oder zwei Minuten ist der Port dann wieder verfügbar. Hier ist, was los ist (wenn es Ihnen egal ist, fahren Sie mit dem Ende fort, wo ich Ihnen zeige, wie Sie den Prozess beenden, der einen bestimmten Port besitzt):
Ports sind Ressourcen, die vom Betriebssystem verschiedenen Prozessen zugewiesen werden. Dies ähnelt dem Auffordern des Betriebssystems nach einem Dateizeiger. Im Gegensatz zu Dateizeigern kann jedoch immer nur EIN Prozess einen Port besitzen. Über die BSD-Socket-Schnittstelle können Prozesse anfordern, einen Port abzuhören, den das Betriebssystem dann gewährt. Das Betriebssystem stellt außerdem sicher, dass kein anderer Prozess denselben Port erhält. Zu jedem Zeitpunkt kann der Prozess den Port freigeben, indem der Socket geschlossen wird. Das Betriebssystem fordert dann den Port zurück. Wenn der Vorgang beendet wird, ohne den Port freizugeben, wird das Betriebssystem den Port schließlich zurückfordern (obwohl dies nicht sofort geschieht: es dauert einige Minuten).
Was Sie jetzt tun möchten (einfach den Port von der Kommandozeile aus schließen), ist aus zwei Gründen nicht möglich. Erstens, wenn es möglich wäre, würde dies bedeuten, dass ein Prozess einfach die Ressource eines anderen Prozesses (den Port) stehlen könnte. Dies wäre eine schlechte Richtlinie, sofern sie nicht auf privilegierte Prozesse beschränkt ist. Der zweite Grund ist, dass unklar ist, was mit dem Prozess geschehen würde, dem der Port gehört, wenn wir ihn weiter laufen lassen. Der Code des Prozesses wird unter der Annahme geschrieben, dass er Eigentümer dieser Ressource ist. Wenn wir es einfach wegnehmen würden, würde es von alleine abstürzen, daher lassen die Betriebssysteme Sie dies nicht zu, selbst wenn Sie ein privilegierter Prozess sind. Stattdessen musst du sie einfach töten.
Wie auch immer, hier erfahren Sie, wie Sie einen Prozess beenden, der einen bestimmten Port besitzt:
sudo netstat -ap | grep :<port_number>
Das wird die Zeile ausgeben, die dem Prozesshalteport entspricht, zum Beispiel:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
In diesem Fall ist procHoldingPort der Name des Prozesses, der den Port geöffnet hat, 4683 die PID und 8000 (beachten Sie, dass es sich um TCP handelt) die Portnummer, die er enthält.
Dann schauen Sie in die letzte Spalte und Sie werden / sehen. Führen Sie dann Folgendes aus:
kill <pid>
Wenn dies nicht funktioniert (Sie können dies überprüfen, indem Sie den Befehl netstat erneut ausführen). Mach das:
kill -9 <pid>
Im Allgemeinen ist es besser, das Senden von SIGKILL zu vermeiden, wenn Sie können. Deshalb sage ich dir, dass du es kill
vorher versuchen sollst kill -9
. Nur mit kill
Sendet der schonendere SIGTERM.
Wie gesagt, es wird noch einige Minuten dauern, bis der Hafen wieder geöffnet ist, wenn Sie dies tun. Ich weiß nicht, wie ich das beschleunigen kann. Wenn es jemand anderes tut, würde ich es gerne hören.