2011-05-13 17 views

cevap

4

Çok olarak bash mevcut sürecin bir FD n kapatabilirsiniz:

exec n<&- 
+0

Teşekkürler. Fakat mevcut sürecin FD'sini kapatmak için kullanılır (bash süreci). Belirli bir sürecin FD'sini kapatmak için herhangi bir yöntem biliyor musunuz? – Eric

0

Sadece diğer süreçler dosya tanımlayıcıları kapanış dolaşmak ve çalışmaya devam etmelerini bekleyemeyiz.

Çok fazla açık olan programı, daha az açılacak şekilde açın. Bu, bir yapılandırma değişikliği veya kaynağın değiştirilmesi vb. Olabilir. Dosyaları bunun için kapatamazsınız.

+8

Elbette yapabilirsin. Bunu yapmak isteyen ortak bir durum, programın fd'leri sızdırması; bu durumda asla bir daha kullanmaz. Elbette, bu bir böcek, ama hala etrafta çalışmak istemek için geçerli. –

+0

Benim durumumda, uzun süredir asılı bir parti işlemim vardı çünkü bir http prizinden bir okur ölmüştü. @ThomasVanderStichele olarak fd'nin kapatılması benim için problemi çözdü :-) –

24

Yetkilendirmeleriniz olduğu sürece, diğer çalışan işlemlerin fd'lerini kesinlikle kapatabilirsiniz.

İlk önce PID'yi bulun. Dosya tanıtıcı bir sızdırıldı ise

(gdb) call close(999) 
$1 = 0 

: Kapatmak istediğiniz fd yakın sistem çağrısı, Sonra

gdb -p 1598 

:

Sonra gdb başlatmak ve işleme ekleme Birincisi, program hiçbir zaman onu bir daha kullanmaya çalışmayacak ve herhangi bir sorun yaratmamalı. Ancak, programın büyük olasılıkla bir hatası vardır. Ben benzer bir durumda koştu ettik

2

, ama benim uygulamanın gerçek zamanlı kısıtları bozulur ve benim testi bozuk beri gdb bir seçenek değildi nerede.

Hızlı bir iptables kuralı ile geldim. İsteğe bağlı bağımsız değişkenler köşeli parantez içine yerleştirilir ([ opt ]). Ben 10.56.4.79:57000 kesmek istiyorum, İşte

netstat --program [ --numeric-host --numeric-ports ] | grep [<pid>]/[<appname>]

$ netstat --program --numeric-ports | grep 8812/ 
tcp  0  0 ysc.xxx:54055   10.56.1.152:30000   ESTABLISHED 8812/my-application 
tcp  0  0 ysc.xxx:46786   postgres.xxx:5432   ESTABLISHED 8812/my-application 
tcp  0  0 ysc.xxx:36090   10.56.4.79:57000   ESTABLISHED 8812/my-application 
             ... 
unix 2  [ ]   DGRAM     7177020 8812/my-application 

:

  1. hedef adresi ve port bulun.

  2. soketi kesmek için bir iptables Kural oluşturun: Bu aşamada At

    iptables -A OUTPUT [ --out-interface <if> --protocol <tcp|udp|unix> ] --destination <addr> --dport <port> --jump DROP

    $ iptables -A OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP 
    $ 
    
  3. , programınız uzak ana bilgisayara paketleri gönderemez. Çoğu durumda, TCP bağlantısı kapalıdır. Eğer varsa, testlere devam edebilirsiniz.

    Sadece bir D tarafından A yerine aynı iptables kuralı yazın:

    $ netstat --program --numeric-ports | grep 8812/ 
    tcp  0  0 ysc.xxx:54055   10.56.1.152:30000   ESTABLISHED 8812/my-application 
    tcp  0  0 ysc.xxx:46786   postgres.xxx:5432   ESTABLISHED 8812/my-application 
                 ... 
    unix 2  [ ]   DGRAM     7177020 8812/my-application 
    
  4. iptables kural çıkarın. o

    $ iptables -D OUTPUT --destination 10.56.4.79 --dport 57000 --jump DROP 
    $ 
    
+0

Amacım, uygulamanızın kritik bir hizmetle bağlantısını kaybederse nasıl tepki vereceğini test etmekti. – YSC

İlgili konular