2012-09-17 13 views
11

Bir sunucuda çalışan bir işlemin 30 örneğim var ve her bir işlem için açık dosyaları günlüğe kaydetmek istiyorum.lsof, tüm açık dosyaları bir dizi belge için vermelidir

* ps auwwx | grep PROG_NAME | awk '{print $2}' | xargs lsof -p | less 

Bu şikayetler , "lsof: durum hatası: Böyle bir dosya ya da dizine" Ben lsof -p <pid> çalıştırırsanız

Ancak, bana verir

Ben aşağıdaki komutu çalıştırılmadan Bu işlem için açık dosyaların listesi. FreeBSD makinesinde, işlemin tüm 30 örneği için tüm açık dosyaların listesini nasıl alabilirim.

Ayrıca, paylaşılan kitaplıkların listelenmesini istemiyorum. -d "^txt" yaparsam, gösterilmek istediğim diğer db dosyalarını göstermiyor. .so dosyalarını grep dışarı başka yolu var mı?

+0

: Belirli bir desen eşleştirme komutlar gelen tüm açık dosyaları listelemek için lsof -c kullanmak Benzer bir sorunu çözmek istedik - açık dosya sayısını sayma süreç başına, özellikle Java. Ben böyle yaptım: pgrep java | xargs -I {} bash -c 'printf {}; lsof -p {} | wc -l ' –

cevap

14

lsof -p seçeneği, virgülle ayrılmış bir PID listesi alır. xargs'u kullanma şekliniz, dosyaları bir dosya ismi olarak yorumlanacak şekilde yönlendiren ayrı argümanlar olarak gönderecektir. lsof bakım olacak ama gerekirse bunu kapalı sed eğer

bir eğik virgül olacak lsof -p $(your grep | tr '\012' ,) deneyin, emin değilim.

5

lsof pid başına bir kez çalıştırmak için xargs -L1 lsof -p kullanabilirsiniz.

Daha da iyisi: İnternet geçen kimse tarafından Bilginize

lsof -c bas # list all processes with commands starting with 'bas' 
lsof -c '/ash$/x' # list all commands ending with 'ash' (regexp syntax) 
İlgili konular