web-dev-qa-db-fra.com

Comment puis-je me débarrasser des sockets dans l'état FIN_WAIT1?

J'ai un port bloqué par un processus que je devais tuer. (un petit démon telnet qui s'est planté). Le processus a été tué avec succès, mais le port est toujours dans un état "FIN_WAIT1". Cela n'en sort pas, le délai d'attente semble être fixé à "une décennie".

Le seul moyen que j'ai trouvé pour libérer le port est de redémarrer la machine entière, ce qui est bien sûr quelque chose que je ne veux pas faire.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

Est-ce que quelqu'un sait comment je peux débloquer ce port sans redémarrer?

20
Gert M
# 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
19
IdaWong

Vous devriez pouvoir définir le délai d'expiration avec /proc/sys/net/ipv4/tcp_fin_timeout.

Il ne semble vraiment pas y avoir de moyen d'effacer le socket manuellement.

7
innaM

Il semble que le paramètre tcp_Orphan_retries contrôle le nombre de tentatives qui seront effectuées avant la libération d'un port sans serveur. Il était de 0 ici, après l'avoir mis à 1, les ports avaient disparu.

HTH

6
user64877

/proc/sys/net/ipv4/tcp_fin_timeout est le délai d'expiration de l'état FIN-WAIT-2, et non FIN-WAIT-1. Vous devriez suivre la route tcpkill ou vous pouvez essayer de jouer avec les temps de Keepalive sous /proc/sys/net/ipv4/tcp_keepalive_* pour forcer une mise à mort par le SO.

5
Fabricio González

L'exécution de ces étapes sous l'ID racine et cela m'a effacé:

Capturez le paramètre du noyau à modifier dans une variable

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Définissez temporairement le nombre maximal d'orphelins sur 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Vérifiez que le port problématique n'est plus utilisé

$ netstat -np|grep 9716

Attendez un peu et répétez l'étape ci-dessus si nécessaire jusqu'à ce que la commande ci-dessus ne renvoie aucune ligne

Réinitialisez le paramètre du noyau tcp_max_orphans à la valeur d'origine à partir de la variable ci-dessus

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
2
Rad Mandapati

FIN_WAIT1

L'application sur la machine locale a fermé la connexion. Une indication de cela a été envoyée à la machine distante.

Votre application a fermé son côté de la connexion, le socket attend maintenant que le côté distant confirme cette fermeture. Si vous avez un problème avec un grand nombre de ces sockets dans FIN_WAIT1 alors vous devriez suivre les conseils de Manni ci-dessus.

1
Dave Cheney

Sur le noyau Linux> = 4.9, vous pouvez utiliser la commande ss d'iproute2 avec la clé -K

ss -K dst 192.168.1.214 dport = 49029 le noyau doit être compilé avec l'option CONFIG_INET_DIAG_DESTROY activée.

via https://unix.stackexchange.com/a/511691/43898

0
eri