lsof -p PID बनाम lsof | grep पीआईडी


12

मुझे lsof कमांड के ouput की समझ नहीं है।

जब मैं लिखता हूँ

lsof -p PID

मुझे 4 लाइनें मिलती हैं और जब मैं लिखता हूं

lsof | grep PID

मुझे सैकड़ों लाइनें मिलती हैं।

क्या यह एक ही परिणाम नहीं लौटाना चाहिए?

आपके जवाबों के लिए शुक्रिया। यहाँ उत्पादन कर रहे हैं। ऐसा लगता है कि यह उप प्रक्रिया है या इस कार्य का क्या अर्थ है?

lsof -p 29076
COMMAND   PID  USER   FD      TYPE DEVICE SIZE/OFF NODE NAME
java    29076  pr    cwd   unknown                      /proc/29076/cwd (readlink: Permission denied)
java    29076  pr    rtd   unknown                      /proc/29076/root (readlink: Permission denied)
java    29076  pr    txt   unknown                      /proc/29076/exe (readlink: Permission denied)
java    29076  pr   NOFD                                /proc/29076/fd (opendir: Permission denied)

lsof |grep 29076|head -20
java      29076        pr  cwd   unknown                          /proc/29076/cwd (readlink: Permission denied)
java      29076        pr  rtd   unknown                          /proc/29076/root (readlink: Permission denied)
java      29076        pr  txt   unknown                          /proc/29076/exe (readlink: Permission denied)
java      29076        pr NOFD                                    /proc/29076/fd (opendir: Permission denied)
java      29076   300  pr  cwd   unknown                          /proc/29076/task/300/cwd (readlink: Permission denied)
java      29076   300  pr  rtd   unknown                          /proc/29076/task/300/root (readlink: Permission denied)
java      29076   300  pr  txt   unknown                          /proc/29076/task/300/exe (readlink: Permission denied)
java      29076   300  pr NOFD                                    /proc/29076/task/300/fd (opendir: Permission denied)
java      29076   329  pr  cwd   unknown                          /proc/29076/task/329/cwd (readlink: Permission denied)
java      29076   329  pr  rtd   unknown                          /proc/29076/task/329/root (readlink: Permission denied)
java      29076   329  pr  txt   unknown                          /proc/29076/task/329/exe (readlink: Permission denied)
java      29076   329  pr NOFD                                    /proc/29076/task/329/fd (opendir: Permission denied)
java      29076   330  pr  cwd   unknown                          /proc/29076/task/330/cwd (readlink: Permission denied)
java      29076   330  pr  rtd   unknown                          /proc/29076/task/330/root (readlink: Permission denied)
java      29076   330  pr  txt   unknown                          /proc/29076/task/330/exe (readlink: Permission denied)
java      29076   330  pr NOFD                                    /proc/29076/task/330/fd (opendir: Permission denied)
java      29076   331  pr  cwd   unknown                          /proc/29076/task/331/cwd (readlink: Permission denied)
java      29076   331  pr  rtd   unknown                          /proc/29076/task/331/root (readlink: Permission denied)
java      29076   331  pr  txt   unknown                          /proc/29076/task/331/exe (readlink: Permission denied)
java      29076   331  pr NOFD                                    /proc/29076/task/331/fd (opendir: Permission denied)

जवाबों:


7

वास्तविक आउटपुट को देखे बिना यह कहना मुश्किल है कि वास्तव में क्या हो रहा है, लेकिन मैं अनुमान लगा रहा हूं कि यह इस तथ्य के कारण है कि lsof -p PIDकमांड केवल उन फाइलों को प्रिंट कर रहा है जो निर्दिष्ट पीआईडी ​​द्वारा खोले गए हैं, जबकि lsof | grep PID'पीआईडी' के किसी भी लाइन को प्रिंट कर रहा है। लाइन में कहीं भी स्थित है। उदाहरण के लिए, यदि आप PID = 123 की खोज कर रहे हैं, तो आपका grepविकल्प PID की 1231, 1232, 1233, इत्यादि के साथ-साथ उन फ़ाइलों को भी प्रिंट करेगा, जो 123 के साथ फ़ोल्डर में अपने पूर्ण पथ में कहीं भी स्थित हैं।

EDIT: आपके विशिष्ट उदाहरण में अंतर यह है कि lsofएक थ्रेड द्वारा खोली गई फ़ाइलों को अनदेखा कर रहा है। यदि आप grepउदाहरण में आउटपुट को देखते हैं तो तीसरा कॉलम 'TID' या थ्रेड आईडी है। जब आप -pविकल्प का उपयोग कर रहे थे तो एक TID मैच के बिना लाइन्स जो आप देख रहे थे । TID वाली लाइनें (यानी, अन्य थ्रेड्स द्वारा खोली गई लाइनें) अतिरिक्त हैं।


दरअसल, TID को मैन पेजों में "टास्क IDentification नंबर" के रूप में संदर्भित किया जाता है, जरूरी नहीं कि यह थ्रेड आईडी हो।
मिलजेन मिकिक

2

lsof - खुली हुई फ़ाइलों की सूची, lsof के लिए मैन पेज पढ़ने की कोशिश करें #man lsof

lsof -p PID PID के प्रोसेस आईडी से जुड़ी खुली फाइलों को सूचीबद्ध करता है।

किसी भी विकल्प के अभाव में, lsof सभी सक्रिय प्रक्रियाओं से संबंधित सभी खुली फाइलों को सूचीबद्ध करता है। जब आप ऐसा करते हैं lsof | grep PID, तो यह सभी सक्रिय प्रक्रियाओं से संबंधित सभी खुली फाइलों को सूचीबद्ध करता है और पीआईडी ​​नंबर को ट्रेस करता है, जो पीआईडी ​​से मेल खा सकता है और कहीं भी, जहां पीआईडी ​​अन्य पीआईडी ​​के हिस्से के रूप में प्रकट होती है और पीआईडी ​​की बाल प्रक्रिया भी हो सकती है, और जल्द ही।

इसलिए, यदि आप उपयोग करना चाहते हैं, तो आपको lsof | grep PIDपीआईडी ​​से पूरी तरह से मेल खाना चाहिए, जैसे कि पूर्ण शब्द मिलान lsof | grep -w PID, लेकिन यह तब भी अधिक लाइनों का परिणाम होगा यदि पीआईडी ​​में अन्य बाल प्रक्रियाएं हैं।


0

मैंने अपने सिस्टम पर यह कोशिश की, और दोनों कमांड समान सूचियां उत्पन्न करते हैं, मेरा सुझाव है कि आप दोनों आदेशों को लगातार कई बार आज़माएं, बस यह सुनिश्चित करने के लिए कि प्रक्रिया की स्थिति स्थिर है। मैन पेज और आपके आउटपुट के अनुसार, यह एकमात्र स्पष्टीकरण है जो मेरे पास हो सकता है।


0

Lsof के कुछ संस्करणों में एक थ्रेड आईडी शामिल है। यह आउटपुट में स्पष्ट TID कॉलम हैडर द्वारा निर्धारित किया जा सकता है। इस तरह का आउटपुट प्रविष्टियों के दोहराव को जन्म देगा क्योंकि lsof संभावित रूप से प्रत्येक थ्रेड के लिए डुप्लिकेट प्रविष्टियों को दिखाएगा।

https://support.datastax.com/hc/en-us/articles/209826153-lsof-shows-Cassandra-is-holding-a-large-amount-of-files-open

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.