У меня есть порт, заблокированный процессом, который мне нужно было убить. (маленький демон 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 порты исчезли.
HTH
/proc/sys/net/ipv4/tcp_fin_timeout
- это время ожидания состояния FIN-WAIT-2, а не FIN-WAIT-1. Вам следует пойти по маршруту tcpkill или вы можете попробовать поиграть с временем поддержки активности под /proc/sys/net/ipv4/tcp_keepalive_*
заставить убить SO.
Выполнение этих шагов под корневым идентификатором, и он очистился для меня:
Захватить настройку ядра для изменения в переменной
$ 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.
Может, tcpkill поможет? Подробнее здесь: http://www.cyberciti.biz/howto/question/linux/kill-tcp-connection-using-linux-netstat.php
это может помочь:
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0