Öldürmem gereken bir işlemle engellenen bir limanım var. (çökmüş küçük bir telnet arka plan programı). İşlem başarıyla öldürüldü, ancak bağlantı noktası hala 'FIN_WAIT1' durumunda. Bundan çıkmıyor, bunun için zaman aşımı 'on yıl' olarak ayarlanmış gibi görünüyor.
Bağlantı noktasını serbest bırakmanın tek yolu, tüm makineyi yeniden başlatmaktır, bu da yapmak istemediğim bir şeydir.
$ netstat -tulnap | grep FIN_WAIT1
tcp 0 13937 10.0.0.153:4000 10.0.2.46:2572 FIN_WAIT1 -
Herkes yeniden başlatmadan bu bağlantı noktasının engelini nasıl kaldırabilirim biliyor mu?
# 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
Zaman aşımını /proc/sys/net/ipv4/tcp_fin_timeout
İle ayarlayabilmeniz gerekir.
Soketi manuel olarak temizlemenin hiçbir yolu yok gibi görünüyor.
Tcp_Orphan_retries ayarının, sunucusuz bir bağlantı noktası serbest bırakılmadan önce kaç denemenin yapılacağını kontrol ettiği görülmektedir. Burada 0, 1 olarak ayarlandıktan sonra portlar gitmişti.
HTH
/proc/sys/net/ipv4/tcp_fin_timeout
, FIN-WAIT-2 durumunun zaman aşımıdır, FIN-WAIT-1 değil. Tcpkill rotası ile gitmelisiniz ya da SO tarafından öldürmeye zorlamak için /proc/sys/net/ipv4/tcp_keepalive_*
Altındaki tutma zamanlarıyla oynamaya çalışabilirsiniz.
Bu adımları root ID altında çalıştırmak ve benim için temizlendi:
Bir değişkeni değiştirmek için çekirdek ayarını yakalayın
$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')
Maksimum yetimleri geçici olarak 0 olarak ayarlayın
$ sysctl -w net.ipv4.tcp_max_orphans=0
Sorunlu bağlantı noktasının artık kullanılmadığından emin olun
$ netstat -np|grep 9716
Biraz bekleyin ve yukarıdaki komut satır döndürmeyene kadar yukarıdaki adımı tekrarlayın
Tcp_max_orphans çekirdek parametresini yukarıdaki değişkenin orijinal değerine sıfırlayın
$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
FIN_WAIT1
Yerel makinedeki uygulama bağlantıyı kapattı. Bunun göstergesi uzak makineye gönderildi.
Uygulamanız bağlantının yanını kapattı, soket şimdi uzak tarafın bu kapatmayı onaylamasını bekliyor. Bu soketlerin çoğunun FIN_WAIT1 içinde tutulmasıyla ilgili bir sorununuz varsa, yukarıdaki Manni'nin tavsiyelerine uymalısınız.
Linux çekirdeği> = 4.9'da iproute2'den ss
komutunu -K tuşuyla kullanabilirsiniz
ss -K dst 192.168.1.214 dport = 49029 çekirdek, CONFIG_INET_DIAG_DESTROY seçeneği etkin olarak derlenmelidir.
https://unix.stackexchange.com/a/511691/43898 aracılığıyla