Come posso eliminare i socket nello stato FIN_WAIT1?


18

Ho una porta che è bloccata da un processo che avevo bisogno di uccidere. (un piccolo demone telnet che si è schiantato). Il processo è stato terminato correttamente ma la porta è ancora nello stato "FIN_WAIT1". Non ne viene fuori, il timeout per questo sembra essere impostato su "un decennio".

L'unico modo che ho trovato per liberare la porta è riavviare l'intero computer, il che è ovviamente qualcosa che non voglio fare.

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

Qualcuno sa come posso sbloccare questa porta senza riavviare?

Risposte:


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
migliorerebbe la risposta di cui prendere nota $whateveritwasprima di sovrascriverla.
verificato

7

Dovresti essere in grado di impostare il timeout con /proc/sys/net/ipv4/tcp_fin_timeout.

Non sembra davvero esserci alcun modo per cancellare manualmente il socket.


6
Questa risposta non è corretta tcp_orphan_retries influenza FIN_WAIT1, tcp_fin_timeout influenza FIN_WAIT2.
suprjami,

suprjami è corretto, tcp_fin_timeout influenza FIN_WAIT2. Che viene attivato solo quando si utilizza SO_LINGER.
Matt,

@innaM Puoi per favore rimuovere questa risposta? Non è corretto e accumula downvotes. Vedo che sei ancora attivo, quindi sembra sensato rimuovere la risposta.
Andrew B,

@Andrew B: sembra che non sia possibile eliminare le risposte accettate.
innaM

6

Sembra che l'impostazione tcp_orphan_retries controlli il numero di tentativi che verranno effettuati prima del rilascio di una porta senza server. Era 0 qui, dopo averlo impostato su 1 le porte erano sparite.

HTH


1
Strettamente correlato: 0 è un valore predefinito che significa 8. serverfault.com/a/408882/152073
Andrew B

5

/proc/sys/net/ipv4/tcp_fin_timeoutè il timeout dello stato FIN-WAIT-2, non FIN-WAIT-1. Dovresti seguire il percorso di tcpkill o puoi provare a giocare con i tempi keepalive sotto /proc/sys/net/ipv4/tcp_keepalive_*per forzare un'uccisione da parte degli SO.


2

Eseguendo questi passaggi con l'ID root e ho cancellato:

Cattura le impostazioni del kernel per modificarle in una variabile

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

Impostare temporaneamente il numero massimo di orfani su 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Verificare che la porta problematica non sia più in uso

$ netstat -np|grep 9716

Attendere un po 'e ripetere il passaggio precedente, se necessario, fino a quando il comando precedente non restituisce righe

Ripristina il parametro del kernel tcp_max_orphans al valore originale dalla variabile sopra

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

Ciao, benvenuto su Serverfault. Ho modificato il tuo post per rendere la formattazione della tua risposta più coerente con le altre risposte su questo sito. Per la tua prossima risposta, ti preghiamo di non usare tutti i titoli che hai usato qui e considera di prendere altre risposte come modello per le tue risposte. Grazie per il tuo contributo però. Buon viaggio su serverfault.
Richard,

1

FIN_WAIT1

L'applicazione sul computer locale ha chiuso la connessione. Un'indicazione di questo è stata inviata al computer remoto.

L'applicazione ha chiuso il lato della connessione, il socket è ora in attesa che il lato remoto confermi tale chiusura. Se hai un problema con molte prese che si trovano in FIN_WAIT1 , dovresti seguire i consigli di Manni sopra.


0

Sul kernel Linux> = 4.9 puoi usare il sscomando da iproute2 con il tasto -K

ss -K dst 192.168.1.214 dport = 49029 il kernel deve essere compilato con l'opzione CONFIG_INET_DIAG_DESTROY abilitata.

tramite /unix//a/511691/43898



-4

questo può aiutare:

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
Può essere utile se spieghi di cosa si tratta. Siamo professionisti e, come tali, non incolliamo ciecamente roba e speriamo che aiuti.
Michael Hampton
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.