2010-03-26 18 views
6

Eğer lsof kullanarak açıksa, tek bir dosyayı test etmeye çalışıyorum. Bundan daha hızlı bir yolu var mı?Tek bir açık dosya bulmak için lsof'u kullanmanın en hızlı yolu nedir?

$result = exec('lsof | grep filename | wc -l'); 

if($result > 0) { 
    //file is open 
} 

Dosya adını biliyorsanız, bunların yalnızca bir dosyayı sınamanın bir yolu olması gerektiğini düşünüyorum. Tek ihtiyacım olan doğru ya da yanlış.

cevap

9

Daha iyi bir yol buldum.

if lsof filename > /dev/null; then 
    # file is open 
fi 
2

Eh, wc atlayıp grep'in dönüş değerini kullanabilirsiniz (bu desen tespit etmezse grep) (bu desen ve 1 algılarsa) yani değil-başarısını 0 (yani başarı döndürür):

if lsof | grep filename > /dev/null; then 
    # filename is in output of lsof 
fi 

Sen biraz grep en -l bayrağını kullanarak bu iyileştirebilir:

if lsof | grep -l filename > /dev/null; then 
... 

Bu ilk maç var algılar kez bakarak durdurmak için grep söyler.

+0

Dosyayı kullanan işlemi gerçekten önemsiyorsanız, grep için '-m 1 'seçeneğini kullanmak daha iyi olur, böylece eşleme satırını (stdin) yerine gerçekte eşleşme elde edersiniz. (Aksi takdirde, '-l' nin güzel alternatif kullanımı.) – Cascabel

1

kullanın fuser: lsof (sürümüne 4.63 üzerinde test) ile, doğrudan belirli bir dosyayı sorgulayabilir. Belirtilen dosyalardan herhangi biri kullanılıyorsa sıfırdan döner ve hepsi mevcutsa sıfır değerini döndürür.

1

Yapmayın. Cevap, sonuçla bir şey yapmaya çalıştığınız zaman değişebilir. Bunun yerine, dosya ile ne yapmak istediğinizi yapmaya çalışın ve "kullanımda" hatası veya "ihlali paylaşma" işlemlerini gerçekleştirin.

+0

Sizin için: +1, gördüğüm kadarıyla haklı olabileceğinizi düşünüyorum. Cevabınız özellikle soruyu cevaplamıyor olsa da. – jjclarkson

+0

Jared Parsons, sorunun neden asıl kusurlu olduğuna dair güzel bir yazıya sahiptir: http://blogs.msdn.com/jaredpar/archive/2009/12/10/the-file-system-is-unpredictable.aspx Bu gibi durumlarda, WAS'ın sorduğu soruya cevap vermemek en iyisidir, fakat sorulması gereken soru sorulmalıdır. Bir kaç nedenden dolayı –

+0

-1. İlk olarak, "yapma" cevabı * aynı zamanda * naif ve yanlış yönlendirilmiştir. Dosyaların açık mı yoksa danışma kilitlerinin mi tutulduğu, hata ayıklama, izleme veya bir kullanıcıyı uyarmalarını engelleyemediklerini önceden bildirmek için doğrudan sorgulamak isteyen çeşitli yasal nedenler vardır. İkinci olarak, Unix'deki dosya işaretçileri varsayılan olarak herhangi bir kilitleme empoze etmemektedir; açık bir şekilde "flokter" veya başka bir kilitleme mekanizmasını kullanmazsanız, "kullanımda" veya "ihlali paylaşma" hatasını almazsınız - sadece dosyanızı kolayca kurtarabilirsiniz. –

İlgili konular