Çok fazla açık dosya - suçluyu nasıl bulabilirim


69

Çalıştırırken tail -f filename, şu mesajı aldı:

tail: inotify cannot be used, reverting to polling: Too many open files

Bu potansiyel bir problem mi?

Tüm açık dosyalardan neyin sorumlu olduğunu nasıl teşhis edebilirim? Şüpheli süreçlerin bir listesi var, ancak suçlu oldukları ortaya çıkmazsa, hangi sürecin kontrol edileceğini bilmemeye dayanan talimatlar yararlı olacaktır.


1
Üzerinden kullanılabilen dosya tanımlayıcı sayısını arttırdınız mı ulimit?
Ignacio Vazquez-Abrams

2
@ IgnacioVazquez-Abrams Diğer kullanıcılar için faydalı olabilir, ancak bana göre hastalıktan çok semptomları tedavi etmek gibi olurdu.
Andrew Grimm

Yanlış olmasanız da, bazen uygulamaların birçok dosyayı açmasının yasal nedenleri olabilir.
Ignacio Vazquez-Abrams,

Yanıtlar:


72

Kimin bu kadar çok dosyayı açtığını anlamak için lsof kullanabilirsiniz. Genellikle bu kadar çok dosya açan bir (web) sunucusudur, ancak bunun nedeni, nedeni belirlemenize yardımcı olacaktır.

Kimin kötü adamın kim olduğunu anlayınca

Lsof çıktısı oldukça büyükse, dosyayı bir dosyaya yönlendirmeyi ve dosyayı açmayı deneyin.

Örnek ( ilk komutu Ctrl+ yapmanız gerekebilir C)

lsof > ~/Desktop/lsof.log
cat ~/Desktop/lsof.log | awk '{ print $2 " " $1; }' | sort -rn | uniq -c | sort -rn | head -20
vim ~/Desktop/lsof.log

37
lsof | awk '{ print $2; }' | uniq -c | sort -rn | head
Tembeller için

1
Aynı hatayı aldım ve ulimit kullanmak işe yaramıyor. Tail -F komutu hala hatayı döndürür. Sınırı 1024'ten 3000'e çıkardım, o zamana kadar yeterince yerim olduğunu hayal edebiliyorum ... Sanırım yeniden başlatmak zorunda kalacağım!
Alexis Wilke

15
Adokunun çizgisini faydalı buldum, ama önce sıralamanız gerektiğini düşünüyorum (çünkü uniqsadece bitişik çizgilerle çalışır), uniq komutunu çalıştırın, sonra tekrar sıralayın. Yani lsof | awk '{ print $2; }' | sort -rn | uniq -c | sort -rn | head.
Tyler Collier

19
Açık olan çoğu dosyayı sıralamak ve saymak kesinlikle yapılacak en iyi şeydir. Pid ile birlikte işlemin adını göster: '' 'lsof | awk '{$ 2 yazdır "" $ 1; } '| sort -rn | uniq -c | sort -rn | kafa -20 '' '
14:34

2
@gaoithe eğer bunu bir cevaba eklerseniz memnuniyetle affedeceğim:)
Matt Ball

23

Başka birinin ihtiyacı olursa diye ...

ulimit -a

Mevcut tüm limitleri gösterecektir. Özellikle ulimit -n 70000dosya tanımlayıcı sınırını belirleyecektir.

Ayrıca...

cat /proc/sys/fs/file-max

Düzenlenmişse, çekirdek sınırını görüntüler / ayarlar.

sudo echo 200000 > /proc/sys/fs/file-max

Daha ayrıntılı bir açıklamada bulunabilir ...

Kök olmayan bir kullanıcı için açık dosya sınırını nasıl artırabilirim?


3
ulimits vardır, böylece sisteminizdeki kaynak kullanımı üzerinde sıkı bir kontrol sağlayabilirsiniz. Birçok dosya tanımlayıcı kullanmanız gerekeceğini bildiğiniz işlemler için bunları ayrı ayrı artırmak en iyisidir. Testlerde sıkı tutularak, zamanla dosya tanımlayıcılarını düzenli olarak sızdırabilecek işlemleri bulacaksınız. Ayrıca, dosya tanıtıcılarının unix / linux içindeki herhangi bir cihaz erişimi için kullanıldığını unutmayın. Örneğin, bir işlem tarafından açılan her ağ soketi bir dosya tanıtıcısı kullanır. Bu, normal dosya sistemi dosyalarının yanı sıra ağ bağlantıları gibi tüm cihaz dosyalarında neden "çok fazla açık dosya" kullanabileceğinizi açıklar.
Aralık’ta
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.