2010-10-16 5 views
8

Ich habe eine red5 server (JAVA) läuft auf meinem Linux-Server.Linux: Wie kille ich Programme, die Port 1935 benutzen?

Manchmal wird der Server heruntergefahren. Wenn ich versuche, es neu zu starten, erhalte ich einen Fehler:

"Binding Fehler, dieser Port ist alerady im Einsatz".

Also versuche ich, den Server mit killall zu töten -9 java und versuchen, den Server neu zu starten: gleichen Fehler.

Ich muss eine Weile warten (ca. 2-3 Minuten) und neu starten: das funktioniert.

Ich muss nur wissen, warum, wenn ich den Prozess abbringe, ich immer noch 2-3 Minuten warten muss, bevor Port 1935 frei ist und ich den Server wieder laufen lassen kann.

Gibt es eine Möglichkeit, diesen Prozess sofort zu beenden und den Port freizugeben?

+1

ich nicht glaube die Antworten, die SIGKILL für eine fehlgeschlagene Säuberung des Ports verantwortlich machen. Das Betriebssystem weiß genau, dass der Prozess weg ist und gibt seine Ressourcen in der üblichen Weise ab. Der Standardweg für einen gerade geschlossenen TCP-Listenport ist für einige Zeit nicht verfügbar, um Verbindungen mit dem falschen Server auszuschließen. Dies kann am einfachsten durch die Verwendung von SO_REUSEADDR, wie in Justins Antwort erwähnt, vermieden werden. –

Antwort

16

Wenn Sie sicher, dass alte Instanz des Servers sind die Port hält, laufen nur jps, Ihren Server pid in der Liste finden und kill -9 my_pid

Für allgemeine Nicht-Java-Prozess laufen, lsof -i :1935 in der Regel für mich funktioniert. Wieder, nimm pid und töte diesen Prozess.

5

Wenn möglich, sollten Sie die Socket-Option SO_REUSEADDR 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.

Weitere Informationen finden Sie im Javadoc setReuseAddress. Insbesondere gilt Folgendes:

When a TCP connection is closed the connection may remain in a timeout state for a period of time after the connection is closed (typically known as the TIME_WAIT state or 2MSL wait state). For applications using a well known socket address or port it may not be possible to bind a socket to the required SocketAddress if there is a connection in the timeout state involving the socket address or port.

Enabling SO_REUSEADDR prior to binding the socket using bind(SocketAddress) allows the socket to be bound even though a previous connection is in a timeout state.

+0

Er kann dies in Java tun, indem er setReuseAddress aufruft http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html –

+0

Sieht aus, als ob wir beide das gleiche Ding dachten - siehe meine Bearbeitungen :) –

9

Das Problem ist die in der töten.

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.

1

Kill -9 sollte nicht standardmäßig verwendet werden. Der Prozess kann interne Dinge nicht bereinigen.

kill $(netstat -nptl | awk '/:8000/{gsub("/.*", ""); print $7}') 
+0

kill: Verwendung: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... oder kill -l [sigspec] – yarek

+0

scheint ein Fehler mit diesem Befehl zu sein: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... oder kill -l [sigspec] – yarek

1

Dies ist ein praktischer oneliner: Um die pid der Anwendung unter Verwendung von exemple Port 8000 zu töten

kill $(fuser 1935/tcp) 
7

Unmittelbar Beendigung und Portfreigabe bearbeiten:

fuser -k 1935/tcp 
Verwandte Themen