2010-10-16 21 views
8

Ho un red5 server (JAVA) in esecuzione sul mio server Linux.Linux: come eliminare i programmi che utilizzano la porta 1935?

A volte il server si arresta. Quando provo a riavviarlo, ho ricevuto un messaggio di errore:

"Errore di connessione, questa porta è alerady in uso".

così cerco di uccidere il server con killall -9 java e provare a riavviare il server: stesso errore.

Devo aspettare un po '(circa 2-3 minuti) e riavviarlo di nuovo: funziona.

Ho solo bisogno di sapere perché quando uccido il processo devo ancora aspettare 2-3 minuti prima che la porta 1935 sia libera e posso eseguire nuovamente il server.

C'è un modo per interrompere immediatamente questo processo e liberare la porta?

+1

non lo faccio credere alle risposte che incolpano SIGKILL per una fallita pulizia del porto. Il sistema operativo sa perfettamente che il processo è finito e cede le sue risorse nel modo standard. Il modo standard per una porta di ascolto TCP appena chiusa non deve essere a disposizione per qualche tempo per precludere le connessioni al server sbagliato. Questo può essere evitato più facilmente usando SO_REUSEADDR come menzionato nella risposta di Justin. –

risposta

16

Se sei sicuro vecchia istanza del server contiene la porta, basta eseguire jps, trova le pid server nell'elenco ed eseguire kill -9 my_pid

Per processo non-java generica, lsof -i :1935 di solito funziona per me. Di nuovo, prendi pid e uccidi questo processo.

5

Se possibile, è necessario utilizzare l'opzione socket SO_REUSEADDR quando il programma configura il socket. In questo modo è possibile riutilizzare immediatamente il socket al riavvio del programma, invece di dover attendere 2-3 minuti.

Vedere javadoc setReuseAddress per ulteriori informazioni. In particolare:

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

Può farlo in Java chiamando setReuseAddress http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html –

+0

Sembra che entrambi stessimo pensando la stessa cosa - vedi la mia modifica :) –

9

Il problema è il nel kill.

Se si uccide un processo utilizzando SIGKILL (-9), il processo viene terminato immediatamente. Quindi la porta rimane assegnata fino a quando (qualche minuto dopo) gli O.S. nota il problema Prova SIGHUP e SIGINT (nell'ordine) prima di SIGKILL.

In ogni caso, utilizzare netstat -a -t -p per verificare quale processo ha acquisito la porta.

1

kill -9 non deve essere utilizzato per impostazione predefinita. Il processo non può ripulire le cose interne. per uccidere il pid dell'applicazione usando da porto exemple 8000:

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

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

+0

sembra che ci sia un errore con questo comando: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... o kill -l [sigspec] – yarek

1

Questa è un'oneliner a portata di mano:

kill $(fuser 1935/tcp) 
7

elaborare immediatamente la cessazione e la porta di rilascio:

fuser -k 1935/tcp