У меня есть порт, который заблокирован процессом, который мне нужно убить. (маленький демон telnet, который разбился). Процесс был успешно завершен, но порт все еще находится в состоянии 'FIN_WAIT1'. Это не выходит из этого, время для этого, кажется, установлено в "десятилетие".
Единственный способ освободить порт - это перезагрузить всю машину, что, разумеется, я не хочу делать.
$ netstat -tulnap | grep FIN_WAIT1
tcp 0 13937 10.0.0.153:4000 10.0.2.46:2572 FIN_WAIT1 -
Кто-нибудь знает, как я могу разблокировать этот порт без перезагрузки?
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)
#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans
# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed
# restore the value of tcp_max_orphans whatever it was before.
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans
# verify with
netstat -an|grep FIN_WAIT1
Вы должны быть в состоянии установить время ожидания с помощью /proc/sys/net/ipv4/tcp_fin_timeout
.
Кажется, нет никакого способа очистить сокет вручную.
Кажется, параметр tcp_Orphan_retries контролирует, сколько попыток будет сделано до освобождения порта без сервера. Здесь было 0, после установки 1 порты исчезли.
НТН
/proc/sys/net/ipv4/tcp_fin_timeout
- это время ожидания состояния FIN-WAIT-2, а не FIN-WAIT-1. Вам следует пойти по маршруту tcpkill, или вы можете попробовать поиграть со временем активности в /proc/sys/net/ipv4/tcp_keepalive_*
чтобы заставить убить SO.
Выполнение этих шагов под root ID, и это прояснилось для меня:
Захват настройки ядра для изменения в переменной
$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')
Временно установите максимальное число сирот на 0
$ sysctl -w net.ipv4.tcp_max_orphans=0
Убедитесь, что проблемный порт больше не используется
$ netstat -np|grep 9716
Подождите немного и повторите шаг, если это необходимо, пока команда не вернет никаких строк
Сбросить параметр ядра tcp_max_orphans обратно к исходному значению из переменной выше
$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
FIN_WAIT1
Приложение на локальной машине закрыло соединение. Индикация этого была отправлена на удаленный компьютер.
Ваше приложение закрыло свою сторону соединения, теперь сокет ждет, пока удаленная сторона подтвердит это закрытие. Если у вас есть проблема с большим количеством этих сокетов, хранящихся в FIN_WAIT1, тогда вы должны следовать совету Манни выше.
В ядре Linux> = 4.9 вы можете использовать команду ss
из iproute2 с ключом -K
ss -K dst 192.168.1.214 dport = 49029 ядро должно быть скомпилировано с включенной опцией CONFIG_INET_DIAG_DESTROY.