sviluppo-web-qa.it

Come posso eliminare i socket nello stato FIN_WAIT1?

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?

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

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.

7
innaM

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

6
user64877

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

5

Eseguendo questi passaggi con l'ID root, è stato cancellato per me:

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
2
Rad Mandapati

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 molti di questi socket tenuti in FIN_WAIT1 allora dovresti seguire i consigli di Manni sopra.

1
Dave Cheney

Sul kernel Linux> = 4.9 puoi usare il comando ss 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.

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

0
eri