Linux: Wie kille ich Programme, die Port 1935 benutzen?

8

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?

    
yarek 16.10.2010, 12:50
quelle

6 Antworten

16

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

aus

Für generische Non-Java-Prozesse funktioniert lsof -i :1935 normalerweise für mich. Erneut pid und töte diesen Prozess.

    
Nikita Rybak 16.10.2010, 12:55
quelle
9

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.

    
andcoz 16.10.2010 13:04
quelle
7

Abarbeitung und Portfreigabe sofort verarbeiten:

%Vor%     
Alexander Yancharuk 18.12.2013 00:30
quelle
5

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.

    
Justin Ethier 16.10.2010 12:56
quelle
1

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%     
Gilles Quenot 16.10.2010 13:35
quelle
1

Dies ist ein praktischer Oneliner:

%Vor%     
bartek 30.08.2013 08:15
quelle

Tags und Links