2010-10-16 2 views
8

У меня есть red5 server (JAVA), работающий на моем Linux-сервере.Linux: Как убивать программы, использующие порт 1935?

Иногда сервер выключается. Когда я пытаюсь перезапустить его, я получил ошибку:

«Ошибка привязки, этот порт используется в алертаде».

Так что я стараюсь убить сервер с killall -9 Java и попытаться перезапустить сервер: ту же ошибку.

Мне нужно подождать некоторое время (около 2-3 минут) и перезапустить его снова: это работает.

Мне просто нужно знать, почему, когда я убиваю процесс, мне все равно придется ждать 2-3 минуты, прежде чем порт 1935 свободен, и я снова могу запустить сервер.

Есть ли способ немедленно убить этот процесс и освободить порт?

+1

я не делаю верьте ответам, которые обвиняют SIGKILL в неудачной очистке порта. ОС прекрасно знает, что процесс ушел, и он отказывается от своих ресурсов стандартным образом. Стандартный способ для только что закрытого порта прослушивания TCP не должен быть доступен в течение некоторого времени, чтобы исключить подключения к неправильному серверу. Этого можно легко избежать, используя SO_REUSEADDR, как указано в ответе Джастина. –

ответ

16

Если вы уверены, что старый экземпляр вашего сервера держит порт, просто запустить jps, найти свой идентификатор процесса сервера в списке и запустить kill -9 my_pid

Для родового процесса, не Java, lsof -i :1935 обычно работает для меня. Снова возьмите pid и убейте этот процесс.

5

Если возможно, вы должны использовать опцию socket SO_REUSEADDR, когда ваша программа устанавливает свой сокет. Таким образом, вы можете сразу же повторно использовать сокет, когда программа перезагружается, вместо того, чтобы ждать 2-3 минуты.

Для получения дополнительной информации см. Javadoc setReuseAddress. В частности:

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

Он может сделать это на Java, вызвав setReuseAddress http://download.oracle.com/javase/1.4.2/docs/api/java/net/ServerSocket.html –

+0

Похоже, мы оба думали одно и то же - см. Мой edits :) –

9

Проблема заключается в убить .

Если вы убили процесс с использованием SIGKILL (-9), процесс немедленно прекращается. Таким образом, порт остается выделенным до (через минуту) O.S. замечает проблему. Попробуйте SIGHUP и SIGINT (в порядке) перед SIGKILL.

В любом случае используйте netstat -a -t -p, чтобы проверить, какой процесс приобрел порт.

1

kill -9 should'nt используется по умолчанию. Процесс не может очистить внутренние вещи. Чтобы убить PID приложения, используя по Exemple порт 8000:

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

kill: use: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... или kill -l [sigspec] – yarek

+0

Кажется, есть ошибка с этой командой: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... или kill -l [sigspec] – yarek

7

Сразу Завершение процесса и порта релиз:

fuser -k 1935/tcp