Ich habe einen red5-Server (JAVA) auf meinem Linux-Server.
Manchmal wird der Server heruntergefahren. Wenn ich versuche, es neu zu starten, habe ich einen Fehler bekommen:
"Binding error, dieser Port ist in Verwendung".
Also versuche ich den Server mit killall -9 java zu töten und versuchen, den Server neu zu starten: der gleiche Fehler.
Ich muss etwas warten (ca. 2-3 Minuten) und neu starten: das funktioniert.
Ich muss nur wissen, warum, wenn ich den Vorgang abbringe, ich noch 2-3 Minuten warten muss, bevor Port 1935 frei ist und ich den Server wieder starten kann.
Gibt es eine Möglichkeit, diesen Prozess sofort zu beenden und den Port freizugeben?
Wenn Sie sicher sind, dass die alte Instanz Ihres Servers den Port enthält, führen Sie einfach jps
aus, suchen Sie Ihre Server-PID in der Liste und führen Sie kill -9 my_pid
Für generische Non-Java-Prozesse funktioniert lsof -i :1935
normalerweise für mich. Erneut pid und töte diesen Prozess.
Das Problem ist die -9
im Kill.
Wenn Sie einen Prozess mit SIGKILL (-9) beenden, wird der Prozess sofort beendet. So bleibt der Port bis (einige Minuten später) der O.S. bemerkt das Problem. Versuche SIGHUP und SIGINT (in der Reihenfolge) vor SIGKILL.
Verwenden Sie in jedem Fall netstat -a -t -p
, um zu überprüfen, welcher Prozess den Port erworben hat.
Wenn möglich, sollten Sie die Option SO_REUSEADDR
des Sockets verwenden, wenn Ihr Programm den Socket einrichtet. Auf diese Weise können Sie den Socket sofort wiederverwenden, wenn das Programm neu gestartet wird, anstatt 2-3 Minuten warten zu müssen.
Siehe setReuseAddress für mehr Informationen. Insbesondere:
Wenn eine TCP-Verbindung geschlossen wird, kann die Verbindung für eine gewisse Zeit nach dem Schließen der Verbindung in einem Timeout-Zustand verbleiben (normalerweise als TIME_WAIT-Status oder 2MSL-Wartezustand bekannt). Bei Anwendungen, die eine bekannte Socket-Adresse oder einen bekannten Socket verwenden, ist es möglicherweise nicht möglich, einen Socket an die erforderliche SocketAddress zu binden, wenn im Timeout-Status eine Verbindung mit der Socketadresse oder dem Socket besteht.
Wenn SO_REUSEADDR vor dem Binden des Sockets mit bind (SocketAddress) aktiviert wird, kann der Socket gebunden werden, obwohl sich eine vorherige Verbindung in einem Timeout-Status befindet.
kill -9 sollte nicht standardmäßig verwendet werden. Der Prozess kann interne Dinge nicht bereinigen. So beenden Sie die PID der Anwendung, indem Sie beispielsweise Port 8000 verwenden:
%Vor%Tags und Links java linux red5 port kill-process