2012-09-17 21 views
11

के सेट के लिए सभी खुली फाइलें देनी चाहिए मेरे पास सर्वर पर चलने वाली प्रक्रिया के 30 उदाहरण हैं और विश्लेषण के लिए प्रत्येक प्रक्रिया के लिए खुली फ़ाइलें लॉग करना चाहते हैं।lsof को

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

यह शिकायतों कि, "lsof: पर स्थिति त्रुटि: इस तरह के कोई फ़ाइल या निर्देशिका"

हालांकि, अगर मैं lsof -p <pid> चलाने यह मुझे देता है

मैं निम्न आदेश भागा उस प्रक्रिया के लिए खुली फाइलों की सूची। मैं फ्रीबीएसडी मशीन पर प्रक्रिया के सभी 30 उदाहरणों के लिए सभी खुली फ़ाइलों की सूची कैसे प्राप्त कर सकता हूं।

इसके अलावा, मैं साझा पुस्तकालयों को सूचीबद्ध नहीं करना चाहता हूं। अगर मैं -d "^txt" करता हूं तो यह कुछ अन्य डीबी फाइल नहीं दिखा रहा है जिन्हें मैं दिखाना चाहता हूं। एसएसओ फाइलों को grep करने के लिए कोई और तरीका है?

+0

FYI करें: एक विशिष्ट पैटर्न मिलान आदेशों से सभी खुली फ़ाइलों को सूचीबद्ध करने के lsof -c का उपयोग मैं एक ऐसी ही समस्या का समाधान करना चाहता था - खुली फ़ाइलों की संख्या की गणना प्रति प्रक्रिया, विशेष रूप से जावा। मैंने ऐसा किया: 'pgrep जावा | xargs -I {} bash -c 'printf {}; lsof -p {} | wc -l'' –

उत्तर

14

lsof -p विकल्प पीआईडी ​​की अल्पविराम से अलग सूची लेता है। जिस तरह से आप xargs का उपयोग कर रहे हैं, वे अलग-अलग तर्कों के रूप में बोलियां पारित करेंगे जिन्हें कुछ फाइलनामों के रूप में व्याख्या किया जाएगा।

lsof -p $(your grep | tr '\012' ,) आज़माएं कि यह एक पिछला कॉमा होगा, मुझे यकीन नहीं है कि lsof परवाह है, लेकिन यदि आवश्यक हो तो आप sed बंद कर सकते हैं।

5

आप प्रति पृष्ठ एक बार lsof चलाने के लिए xargs -L1 lsof -p का उपयोग कर सकते हैं।

और भी बेहतर: इंटरनेट पासर-दर के लिए

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