Linux: Как убить программы, использующие порт 1935? - PullRequest
8 голосов
/ 16 октября 2010

У меня на сервере Linux работает red5 (JAVA).

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

«Ошибка привязки, этот порт используется в алеради».1011 * killall -9 java и попытаться перезапустить сервер: та же ошибка.

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

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

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

Ответы [ 6 ]

16 голосов
/ 16 октября 2010

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

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

9 голосов
/ 16 октября 2010

Проблема в -9 в убийстве.

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

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

7 голосов
/ 18 декабря 2013

Немедленное завершение процесса и освобождение порта:

 fuser -k 1935/tcp
5 голосов
/ 16 октября 2010

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

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

Когда соединение TCP закрыто, соединение может оставаться в состоянии тайм-аута в течение некоторого времени после того, как соединение закрыто (обычно это называется состоянием TIME_WAIT или состоянием ожидания 2MSL).Для приложений, использующих общеизвестный адрес сокета или порт, может быть невозможно связать сокет с требуемым SocketAddress, если в состоянии тайм-аута имеется соединение с адресом или портом сокета.

Включение SO_REUSEADDR перед привязкойсокет, использующий связывание (SocketAddress), позволяет связать сокет, даже если предыдущее соединение находится в состоянии тайм-аута.

1 голос
/ 30 августа 2013

Это удобный oneliner:

kill $(fuser 1935/tcp)
1 голос
/ 16 октября 2010

kill -9 не должен использоваться по умолчанию.Процесс не может очистить внутренние вещи.Для уничтожения pid приложения используется примерный порт 8000:

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