Назад | Перейти на главную страницу

Как мне избавиться от сокетов в состоянии FIN_WAIT1?

У меня есть порт, заблокированный процессом, который мне нужно было убить. (маленький демон 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.

через https://unix.stackexchange.com/a/511691/43898

Может, 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