Wie entferne ich Sockets im Zustand FIN_WAIT1?


18

Ich habe einen Port, der durch einen Prozess blockiert ist, den ich beenden musste. (Ein kleiner Telnet-Daemon, der abgestürzt ist). Der Prozess wurde erfolgreich beendet, aber der Port befindet sich noch im Status 'FIN_WAIT1'. Es kommt nicht davon, das Timeout dafür scheint auf 'ein Jahrzehnt' festgelegt zu sein.

Die einzige Möglichkeit, den Port freizugeben, besteht darin, den gesamten Computer neu zu starten, was natürlich etwas ist, das ich nicht tun möchte.

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

Weiß jemand, wie ich diesen Port ohne Neustart entsperren kann?

Antworten:


18
# 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

2
Dies würde die Antwort verbessern, die zuerst notiert werden muss, $whateveritwasbevor sie überschrieben wird.
Wurde

7

Sie sollten das Timeout mit einstellen können /proc/sys/net/ipv4/tcp_fin_timeout.

Es scheint wirklich keine Möglichkeit zu geben, den Sockel manuell zu löschen.


6
Diese Antwort ist nicht richtig. tcp_orphan_retries betrifft FIN_WAIT1, tcp_fin_timeout betrifft FIN_WAIT2.
Suprjami

suprjami ist korrekt, tcp_fin_timeout beeinflusst FIN_WAIT2. Was nur bei Verwendung von SO_LINGER ausgelöst wird.
Matt

@innaM Kannst du diese Antwort bitte entfernen? Es ist nicht korrekt und akkumuliert Abwertungen. Ich sehe, dass Sie immer noch aktiv sind, daher erscheint es am sinnvollsten, die Antwort zu entfernen.
Andrew B

@Andrew B: Es scheint nicht möglich zu sein, akzeptierte Antworten zu löschen.
11.

6

Es scheint, dass die Einstellung tcp_orphan_retries steuert, wie viele Versuche durchgeführt werden, bevor ein serverloser Port freigegeben wird. Hier war es 0, nachdem es auf 1 gesetzt wurde, waren die Ports verschwunden.

HTH


1
Eng verwandt: 0 ist eine Standardeinstellung, die 8 bedeutet. Serverfault.com/a/408882/152073
Andrew B

5

/proc/sys/net/ipv4/tcp_fin_timeoutist die Zeitüberschreitung des Zustands FIN-WAIT-2, nicht FIN-WAIT-1. Sie sollten die tcpkill-Route wählen oder versuchen, mit den Keepalive-Zeiten unter /proc/sys/net/ipv4/tcp_keepalive_*zu spielen, um einen Kill durch die SO zu erzwingen.


2

Wenn Sie diese Schritte unter der Root-ID ausführen, wurde Folgendes für mich gelöscht:

Erfassen Sie die Kernel-Einstellung, um sie in einer Variablen zu ändern

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

Setzen Sie die maximale Anzahl der Waisenkinder vorübergehend auf 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Stellen Sie sicher, dass der problematische Port nicht mehr verwendet wird

$ netstat -np|grep 9716

Warten Sie etwas und wiederholen Sie den obigen Schritt, bis der obige Befehl keine Zeilen mehr zurückgibt

Setzen Sie den Kernelparameter tcp_max_orphans auf den ursprünglichen Wert der obigen Variablen zurück

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans

Hallo, Willkommen bei Serverfault. Ich habe Ihren Beitrag bearbeitet, um die Formatierung Ihrer Antwort mit anderen Antworten auf dieser Website in Einklang zu bringen. Verwenden Sie für Ihre nächste Antwort nicht so viele Titel wie hier und ziehen Sie andere Antworten als Vorlage für Ihre eigenen Antworten in Betracht. Vielen Dank für Ihren Beitrag. Viel Spaß beim Fahren auf Serverfault.
Richard

1

FIN_WAIT1

Die Anwendung auf dem lokalen Computer hat die Verbindung geschlossen. Die Anzeige wurde an die entfernte Maschine gesendet.

Wenn Ihre Anwendung die Seite der Verbindung geschlossen hat, wartet der Socket jetzt darauf, dass die Remote-Seite das Schließen bestätigt. Wenn Sie ein Problem damit haben, dass viele dieser Sockets in FIN_WAIT1 gespeichert sind, befolgen Sie die obigen Anweisungen von Manni.


0

Auf einem Linux-Kernel> = 4.9 können Sie den ssBefehl von iproute2 mit der Taste -K verwenden

ss -K dst 192.168.1.214 dport = 49029 Der Kernel muss mit aktivierter Option CONFIG_INET_DIAG_DESTROY kompiliert werden.

über /unix//a/511691/43898



-4

das kann helfen:

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

6
Es kann hilfreich sein, wenn Sie erklären, was das alles ist. Wir sind Profis und als solche fügen wir nichts blind ein und hoffen, dass es hilft.
Michael Hampton
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.